2016-06-14 1 views
-3

У меня есть базовый класс и несколько производных классов. До того, как я использовал один контейнер для управления объектом, но теперь у меня может быть несколько разных типов студентов в этом случае, то есть я решил использовать указатель базового класса для его управления. Однако я не уверен, как я могу работать с объектом вне функции, которая его создала. Ниже приведено то, что я сделал раньше, чтобы управлять объектами. Есть ли что-то подобное для управления контейнерами с указателями базового класса?C++ Использование указателей базового класса вне функции

pointer = new SchoolChild[NoOfChildren];//creates pointer that free up space on memory 

for (int i = 0; i < NoOfChildren; i++) 
{ 
    pointer[i].display(); 
} 
+0

Это просто создает массив для хранения указателей объектов SchoolChild. Измените его на базовый класс, а затем у вас будет массив базовых указателей. В другом месте вам нужно будет установить новые объекты SchoolChild и любые другие производные типы в массив базовых указателей. Это должно произойти до того, как вы попытаетесь вызвать display() для каждой записи массива, иначе он попытается вызвать метод display() в NULL. – amisam

ответ

0

Обычно вы будете переходить от управления в массив из значений к массива из указатели:

// from this (pointer to SchoolChild) 
SchoolChild* children = new SchoolChild[NoOfChildren]; 

children[0].name = "name"; 


// to this (pointer to SchoolChild pointer) 
SchoolChild** children = new SchoolChild*[NoOfChildren]; 

children[0] = new SchoolChild; // allocate each element 
children[0]->name = "name"; 

У вас также есть более удаление делать, необходимости удалять каждый элемент массива, а также сам массив.

for(int i = 0; i < NoOfChildren; ++i) 
    delete children[i]; // delete each element 
delete[] children; // delete[] the array itself 

Лучше использовать контейнеры и смарт-указатели управлять всем, что для вас:

std::vector<std::unique_ptr<SchoolChild>> children(NoOfChildren); 

children[0]->name = "name"; 

Там нет необходимости удалять что-либо здесь, потому что std::unique_ptr s удаляет содержащиеся SchoolChild объекты и std::vector удалит элементы std::unique_ptr.

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