Добавить список класса в другой класс - PullRequest
1 голос
/ 24 января 2012

Я пытаюсь создать сценарий ведущий-ведомый, в котором первый класс содержит список всех других подклассов.Я создал два класса.

Если мой мастер-класс ControllerDetail, а мой подкласс - ControllerPOD: public ControllerDetail .... могу ли я создать список всех ControllerPOD из класса Controller Detail?

Я пытался создать std::list<ControllerPOD> cps; в приватном разделе, но это, очевидно, не работает.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 24 января 2012

Да, вы можете:

class ContollerPOD; //forward declaration
class ControllerDetail
{
   ...
   private:
   std::list<ControllerPOD> cps;
};

class ControllerPOD: public ControllerDetail
{
   ...  
};
1 голос
/ 24 января 2012

Это немного двусмысленно, что вы пытаетесь сделать здесь. ControllerDetail - это класс, а не объект, и у вас их будет много, по одному на каждый ControllerPOD.

Так что, если вы хотите, чтобы у него был список, он должен быть статическим.

Теперь предположим, что вы хотите, чтобы ControllerDetail имел статический список всех существующих в настоящее время объектов, которые являются его производными. Таким образом, у нас будет это:

class ControllerDetail
{
   typedef std::list<ControllerDetail * > list_type;
   static list_type instances;
   list_type::iterator m_iter; // will become apparent later
};

В нашем конструкторе ControllerDetail мы добавим наш экземпляр в список.

ControllerDetail::ControllerDetail() 
{
    instances.push_back( this );
    m_iter = instances.back(); // iterator that holds our object
}

В нашем деструкторе мы удаляем себя из списка

ControllerDetail::~ControllerDetail()
{
    instances.erase( m_iter );
}

И, очевидно, вам, возможно, придется решать проблемы безопасности потоков во всем этом, но вы можете перебирать список и просматривать все текущие экземпляры класса. Поскольку ControllerPOD является производным от ControllerDetail, при его создании он также будет добавлен.

Если вы хотите, чтобы добавлялись только определенные подклассы, вы можете использовать некоторый флаг в конструкторе ControllerDetail, чтобы указать, нужно ли добавлять себя.

Как правило, классу лучше не знать производные от него классы.

Теперь, если ControllerPOD на самом деле не является типом ControllerDetail, тогда ваш ControllerDetail будет иметь список ControllerPOD *, вместо этого ваш конструктор ControllerPOD вместо этого добавит себя и удалит себя из списка, и вам придется отсортировать свой «доступ» чтобы позволить это сделать, но принцип тот же.

Если вашему ControllerPOD передается «родительский» объект, который является ControllerDetail, тогда родительский объект будет иметь список в качестве члена, а ваш ControllerPOD добавит себя и удалит себя из списка родителя. Это предполагает, что родитель переживает ребенка.

Если мы увидим, что вы действительно хотите сделать, мы можем взглянуть на дизайн вашего класса чуть более четко.

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