我正在尝试创建一个主从方案,其中第一个类包含所有其他子类的列表。我创建了两个类。
如果我的主类是ControllerDetail
而我的子类是ControllerPOD: public ControllerDetail
....我可以从Controller Detail类创建所有ControllerPOD的列表吗?
我尝试在私有部分创建std::list<ControllerPOD> cps;
,但这显然不起作用。
谢谢!
答案 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将自己添加并从父列表中删除它自己。这假设父母比孩子寿命长。
如果我们看到你真正想做的事情,我们可以更清楚地看一下你的班级设计。