2017-01-13 8 views
-3

Давайте предположим, что у нас есть базовый класс BaseЛучший способ передать несколько классов ребенка в C++

class Base{ 
virtual double GetNumber(); 
} 

и несколько дочерних классов (давайте назовем их «A», «B» и «C»), которые выглядят например

class A : public Base{ 
double GetNumber(){return 1;}; 
} 

Теперь у меня есть еще один класс, который должен получить дочерний класс через функцию. Это выглядит так:

class Caller(){ 
Base* b; 
void SetB(Base* b){this->b = b;}; 
} 

Я только передаю указатель, чтобы предотвратить нарезку объектов. Однако от того, где я хочу, чтобы вызвать функцию она выглядит следующим образом:

std::vector<Caller> cVec; //multiple Caller object in here 
for (std::vector<Caller>::iterator it = cVec.begin(); it != cVec.end(); ++it){ 
A child; 
//Some manipulation of child 
cVec.SetB(&child); 
} 

Указатель решает проблему объекта нарезка, однако я не хочу, чтобы все объекты идентификации вызывающего абонента, указывающие на того же ребенка. Я мог бы решить это, создав еще один вектор с несколькими экземплярами дочерних классов, но мне интересно, есть ли лучший способ сделать это?

Редактировать 1: Детский объект должен создаваться только в цикле for и управляться объектом Caller.

+6

Непонятно, что вы пытаетесь сделать. Ваш код ошибочен, так как A - это локальная переменная, которая исчезнет после существования цикла for. –

+0

'class Caller() {};' Я никогда не видел функцию/класс, объявленную таким образом – Raindrop7

+1

Это похоже на подлинный вопрос с некоторыми разумными усилиями, чтобы понять проблему с вашей стороны, но, как вы выразились, это действительно неясно, что это. Если вы не хотите, чтобы некоторые указатели указывали на один и тот же объект, просто не указывайте их на один и тот же объект? –

ответ

0

Спасибо за комментарии! Решение было так просто, как просто делать:

std::vector<Caller> cVec; //multiple Caller object in here 
for (std::vector<Caller>::iterator it = cVec.begin(); it != cVec.end(); ++it){ 
cVec.SetB(new A(p1, p2...)); 
} 

В объектах Caller я затем обрабатывать удаление позже.

+0

Вы настраиваете себя на трагедию и боль. Используйте ['std :: unique_ptr'] (http://en.cppreference.com/w/cpp/memory/unique_ptr), чтобы выразить и обеспечить единоличное владение и управлять временем жизни объекта. –