Имеется класс (например, MyClass), поле которого представляют собой динамический массив (например, int *a). Размерность этого массива и выделение для него памяти осуществляется в конструкторе класса: a = new int[N]. По мере работы класса количество элементов массива "а" может меняться, а значит происходит перевыделение памяти для данного массива.
Объявляется класс тоже как динамический массив, ибо количество эелементов заранее неизвество и по мере выполнения программы размерность массива будет меняться.
например:
MyClass *MyCl;
MyCl = new MyClass[M];
так вот мне непонятно, как это реализовать. По идее нужно пересчитывать всю выделяемую память даже при изменении размерности внутриклассового массива "а", но это же геморой. И реально ли это вообще реализовать?
Выделение памяти для класса с динамическим массивом
не понял.... больше кода в студию....
допустим есть класс
class MyClass
{
int *a;
public:
MyClass() { a = new int[10] }
Resize_a(); //допустим, что этим методом перевыделяется память для "а"
};
...
int main()
{
MyClass *MyCl;
MyCl = new MyClass[10]; //и далее по мере работы программы количество элементов данного массива тоже меняется
...
}
проблемы:
1. "MyCl = new MyClass[10];" в принципе нельзя писать, потому что для "int *a;" выделится памяти, как для указателя. а как по другому это сделать, я пока додумать не могу.
2. если происходит перевыделение памяти для массива "а" методом Resize_a, то получается, что нужно перевыделять память и для массива "MyCl". как это сделать, тоже пока не понимаю.
зы для изменения количества элементов динамического массива я выделяют память для нового динмассива, копирую туда командой memcpy содержимое старого динмассива и удаляю старый динмассив.
MyCl = new MyClass[10];
здесь создаётся массив в куче из 10 объектов MyClass. для каждого из них вызывается конструктор по умолчанию, который создаёт массив в куче длинной 10 и инициализирует его адресом указатель *a.
сами вопросы какие-то бессмысленные.
даже так? но это даже проще.
а вот теперь допустим ситуация:
мне требуется увеличить массив MyCl на несколько элементов.
по идее, мы должны создать новый массив (с новым количеством элементов в нём), скопировать туда всё из старого массива и удалить старый массив.
так. значит при создании нового массива мы должны учесть количесво элементов массива "а" в каждом объекте старого массива MyCl.
вроде всё понятно, но как то мне это кажется запутанным. как будто есть способ проще. ведь полей в классе MyClass может быть много, да и не факт, что мы сможем узнать количество элементов каждого массива. надо ещё подумать...
можно ещё перед изменением размера массива MyCl создать массив указателей и скопировать в него адреса массивов "а" каждого объекта MyCl.
а потом, после сознания нового массива, новым "а" присвоить указатели из вышесозданного массива указателей.
но при этом нельзя будет прописать в деструкторе класса MyClass удаление памяти массива "а": delete [] а. и придётся делать это вручную каким нить методом.
так. значит при создании нового массива мы должны учесть количесво элементов массива "а" в каждом объекте старого массива MyCl.
зависит от реализации копирующего конструктора или оператора равно, но ИРЛ такое не встречается т.к. объекты-массивы делают не копируемыми, а если нужен массив таких объектов, то в нём хранятся указатели(явно или нет).
по идее, мы должны создать новый массив (с новым количеством элементов в нём), скопировать туда всё из старого массива и удалить старый массив.
1. ТОлько осознал, что я в свое время на плюсах делал по сишному в подобной ситуации. Правда у меня был не массив объектов, а работа с набором байтов. Но, почему бы не воспользоваться:
malloc, realloc ....? Это раз.
2. Может задача позволяет создать двусвязный/односвязный список?
3. Если воспользоваться готовыми решениями . Например использовать векторы?
А каждый раз создавать новый массив и копировать старый... Имхо это жесть.
Используйте стандартную библиотеку шаблонов STL