将类的列表添加到另一个类

时间:2012-01-24 16:56:51

标签: c++ list class inheritance

我正在尝试创建一个主从方案,其中第一个类包含所有其他子类的列表。我创建了两个类。

如果我的主类是ControllerDetail而我的子类是ControllerPOD: public ControllerDetail ....我可以从Controller Detail类创建所有ControllerPOD的列表吗?

我尝试在私有部分创建std::list<ControllerPOD> cps;,但这显然不起作用。

谢谢!

2 个答案:

答案 0 :(得分:2)

是的,你可以:

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

class ControllerPOD: public ControllerDetail
{
   ...  
};

答案 1 :(得分:1)

你在这里尝试做的有点模棱两可。 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将自己添加并从父列表中删除它自己。这假设父母比孩子寿命长。

如果我们看到你真正想做的事情,我们可以更清楚地看一下你的班级设计。