//------------------------------------------------------------------------------
// Мечта моего детства —
// создать "динамический массив"
// такой, чтобы не следить за памятью, ни при создании, ни при удалении,
// и снаружи никаких указателей.
// В конце файла — реализация этого класса, и соответствующие жалобы
//------------------------------------------------------------------------------
template <class T> class IList{
public:
int Length;
T *Items; //Указатель на сам массив
IList();
~IList();
IList operator = (IList);
T& operator [](int i) {return Items[i];}
void Add(T); //Добавить элемент к массиву
void Add(); //Добавить пустой элемент к массиву
void Clear(); //Отчискта массива
private:
};
//-------------------------------------------------------------------------------------
template <class T> IList<T>::IList(){
Length = 0;
}
//-------------------------------------------------------------------------------------
template <class T> IList<T>::~IList(){
delete Items;
}
//-------------------------------------------------------------------------------------
template <class T> IList<T> IList<T>::operator = (IList<T> data){
delete Items; //Удалить старый список
Length = 0;
for(int i=0; i<data.Length; i++)
Add(data.Items[i]); //Создать новый
return *this;
}
//-------------------------------------------------------------------------------------
template <class T> void IList<T>::Add(T data){
T *NewItems = new T[Length+1]; //Создать новый список (длинее существующего на 1)
for(int i = 0; i < Length; i++)
NewItems[i] = Items[i]; //Копировать старые данные в новые
NewItems[Length] = data; //Записать новые данные в конец нового списка
delete Items; //Удалить старый список
Items = NewItems; //Сохранить адресс нового списка
Length++; //Увеличить длинну списка на 1
}
//-------------------------------------------------------------------------------------
template <class T> void IList<T>::Add(){
T *NewItems = new T[Length+1];
for(int i = 0; i < Length; i++)
NewItems[i] = Items[i];
delete Items;
Items = NewItems;
Length++;
}
//-------------------------------------------------------------------------------------
template <class T> void IList<T>::Clear(){
delete Items;
Length = 0;
Items = 0;
}
//-------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender){
int i, j, c = 2;
IList <int> a;
for(i=0; i<c; i++)
a.Add(i);
for(i=0; i<a.Length; i++)
Memo1->Lines->Add(IntToStr(a[i]));
//До сюда работает, но если закрыть программу — ругается
//А дальше ругается сразу во время выполнения
IList <IList <int> > b; //двумерный массив
for(i=0; i<c; i++){
b.Add();
for(j=0; j<c; j++)
b[i].Add(j);
}
for(i=0; i<b.Length; i++)
for(j=0; j<b[i].Length; j++)
Memo1->Lines->Add(IntToStr( b[i][j] ));
}
//-------------------------------------------------------------------------------------
// Где-то, где я не понял, вызывается деструктор.
// Почему он вызывается?
// Еще вопрос — Если удалять динамический массив, будет ли вызываться
// деструктор для каждого его элемента?
//-------------------------------------------------------------------------------------