【问题标题】:Add a list of a class to another class将一个类的列表添加到另一个类
【发布时间】:2012-02-17 22:26:40
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

  • 您希望 ControllerDetail 拥有其子类的所有实例的列表还是只是 ControllerPOD 的列表?

标签: c++ list class inheritance


【解决方案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 将添加自己并从父列表中删除自己。这假设父母比孩子长寿。

如果我们看到你真正想要做什么,我们可以更清楚地了解你的类设计。

【讨论】:

  • 是的,我想我并没有完全说出我的意思。我想要父类中子类的对象列表,有意义吗?
  • 我最终所做的实际上是将一个 ControllerPOD 对象分配给一个 ControllerDetail 对象,然后我只使用一个控制器详细信息列表。到目前为止似乎正在工作!
  • 请记住,继承定义了“是一种类型”的关系,而不是“被包含”。不要将父->子图与类层次结构混淆。
【解决方案2】:

是的,您可以:

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

class ControllerPOD: public ControllerDetail
{
   ...  
};

【讨论】:

  • @hmjd:不一定。为什么要这样做?
  • 这种类型符合他的要求,但我无法在这里确切地看到 ControllerPOD “是”ControllerDetail 的一种。
猜你喜欢
  • 2013-02-10
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 2021-08-18
相关资源
最近更新 更多