Изменение размера указателей на объекты с одинаковым базовым классом - PullRequest
0 голосов
/ 18 декабря 2011

У меня проблема в C ++, и я не могу найти ответ на нее.У меня есть несколько классов:

class Xyz{
   //...
};
class MyClass1: public Xyz{
   //...
};
class MyClass2: public Xyz{
   //...
};
class MyClass3: public Xyz{
   //...
};

Как вы можете видеть, MyClass1, MyClass2 и MyClass3 имеют одинаковый базовый класс.Теперь я хочу определить некоторые объекты:

MyClass1 *object1 = new MyClass1();
MyClass2 *object2 = new MyClass2();
MyClass3 *object3 = new MyClass3();

После этого я хочу создать динамический массив с указателями на эти объекты (насколько я знаю, это возможно) и целое число, которое сохраняет количество элементов в этом массиве,Я назвал этот массив someName и в будущем он должен хранить object1, object2 и object3.

Xyz **someName;
int numberOfElements = 0;

Проблемы начинаются здесь.someName пусто, поэтому я хочу что-то добавить к нему.Но я не знаю, как создать новый массив с указанным количеством мест для указателей, чтобы скопировать в него старый элемент.Конечно, это не работает:

Xyz **someNameTemp = new Xyz[numberOfElements+1];

Есть идеи, как должна выглядеть функция изменения размера?Спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 18 декабря 2011

Вы можете избежать всех хлопот, и просто используйте std::vector:

std::vector<Xyz *> pointers;

pointers.push_back(new MyClass1());
pointers.push_back(new MyClass2());
// etc.

[ Примечание: Вы должны строго рассмотреть , а не , используя необработанные указатели; вместо этого используйте умные указатели, поскольку это значительно упрощает управление ресурсами. ]

0 голосов
/ 18 декабря 2011
Xyz **someNameTemp = new Xyz*[numberOfElements+1];
for (int i=0; i<numberOfElements; ++i)
    someNameTemp[i] = someName[i];
delete [] someName;
someName = someNameTemp;
++numberOfElements

// someName[numberOfElements - 1] uninitialized

Кроме того, при первом создании указателя обязательно его инициализируйте. Либо в NULL, либо в выделенный массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...