Init使用基类对象派生类对象

时间:2013-01-28 10:48:07

标签: c++

我有以下类型:

typedef std::vector<Node> Nodes;
struct Top: public Nodes {};
struct Middle: public Nodes {};
struct Bottom: public Nodes {};

现在假设我的测试类构造了一个名为Nodes的{​​{1}}对象:

_standardNodes

如何使用存储在节点中的数据创建Top的实例?

3 个答案:

答案 0 :(得分:2)

继承向量不是一个好主意;你想在那里建立一种关系,而不是一种关系。使用拥有class NodeStore std::vector的父Node并继承其中的所有其他Node类。

然后编写一个适当的构造函数(对于每个类),接受您需要的每个对象类型。它可能看起来像这样:

class NodeStore {
    std::vector<Node> m_nodes;

    std::vector<Node>& getNodes() { return m_nodes; }
}

class TopNode {
  TopNode ( NodeStore& store ): m_nodes(store.getNodes()) 
  {
  }

}

答案 1 :(得分:0)

通常避免继承容器类型(例如,析构函数未声明为虚拟,这意味着您需要注意多态性)。你应该prefer composition instead

但是,要回答你的问题,你需要在Top中定义一个合适的构造函数,然后调用相应的基类构造函数:

struct Top : public Nodes {
    Top(const Nodes &rhs) : Nodes(rhs) {}
    ...
};

答案 2 :(得分:0)

您尚未向我们展示NodesTopMiddle和{}的使用情况 Bottom,但从事物的外观来看,我认为这不可能 因为几个原因而被迫工作。

最重要的原因很简单:std::vector<Node>可以 仅包含Node类型的对象。 Top类型的对象, 如果MiddleBottom将被切片(转换为Node) 插入,所以你松散派生类型。

你不能做struct Top : public std::vector<Top>之类的东西(不是我认为那是你想要的),因为 你不能在不完整的类型上实例化一个向量 无法从未经实例化的模板派生。

通常的解决方案是创建一个Tree类,然后使用 节点中的std::vector<Node*>(作为成员,而不是通过 遗产)。或者,您可以使用Boost的指针向量 (但要小心对象的生命周期),或者如果你知道的话 你永远不需要后退指针,你可以使用 std::vector<std::unique_ptr<Node>>(但界面变为 有点棘手,你还需要小心 对象的生命周期 - 从树中删除对象 摧毁它。)