2012-04-14 3 views
1

Извините за путаницу тему, это был оригинальный вопрос:C++ производный класс массив Перераспределение

Как перераспределить массив указателей на базовый класс, который на самом деле точки в различных производных классов?

я не должен использовать динамическое произнесение, TypeId или RTTI здесь, если это возможно ..

EDIT Я просто понял, что я мог бы попробовать сохранить элементы массива и просто устанавливая указатели в новом массиве на старые элементы .. Но тогда как сделать operator = или Cctor?

Или:

Как перераспределить этот массив «плохой путь», на самом деле копирование элементов?

Пример:

class Base {...} 
class Derived1 : public Base {...} 
class Derived2 : public Base {...} 

int main() 
{ 
    int arrayLength=0, arrayMaxLength=3; 

    Base **array=new Base*[arrayMaxlength]; 
    array[0]=new Derived1(); 
    array[1]=new Derived2(); 

    //Reallocation starts... 
    Base **tmp=new Base*[arrayMaxLength*=2]; 

    for(int i=0;i<arrayLength;i++) 
    tmp[i]=new Base(*array[i]);  //<------ What to put here instead of Base? 


    //The unimportant rest of Reallocation.. 
    for(int i=0;i<arrayLength;i++) 
    delete array[i]; 
    delete [] array; 
    array=tmp; 
} 

ответ

1

Вам не нужно делать какие-либо литья (динамический или иным образом): просто повторно использовать указатели

Base **array=new Base*[arrayMaxlength]; 
array[0]=new Derived1(); 
array[1]=new Derived2(); 

//Reallocation starts... 
Base **tmp=new Base*[arrayMaxLength*=2]; 

for(int i=0;i<arrayLength;i++) 
    tmp[i]=array[i]; 

// ... 

объекты уже выделены и имеют надлежащее тип. Вы можете просто скопировать указатели на новый массив.

Примечание, что вы должны быть осторожны, чтобы не delete в (объекты на которые указывают) указатели в старом массиве, так как это может сделать недействительными те, в новый объект (объект, на который указывает сохраненными указателей делает больше не существует) - просто удалите исходный массив iself.

Если управление указателями становится обременительным, вы можете использовать какой-то общий указатель (библиотека BOOST предлагает разнообразные, например)

+0

Спасибо, я просто понял, что сам .. Но что делать в копии конструктор или оператор =? мне нужно как-то скопировать туда элементы. –

+2

Если вам действительно нужно сделать копию элементов, лучшим способом было бы предоставить виртуальный метод 'copy' или' clone', который возвращает вновь выделенный объект, который является копией оригинала: вам нужно переопределить его с помощью правильная логика для каждого производного calss. Вы можете увидеть пример в [этот разговор] (http://en.allexperts.com/q/C-1040/constructor-virtual.htm) – Attila

+0

Отлично, спасибо! –

Смежные вопросы