我有以下类型:
typedef std::vector<Node> Nodes;
struct Top: public Nodes {};
struct Middle: public Nodes {};
struct Bottom: public Nodes {};
现在假设我的测试类构造了一个名为Nodes
的{{1}}对象:
_standardNodes
如何使用存储在节点中的数据创建Top的实例?
答案 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)
您尚未向我们展示Nodes
和Top
,Middle
和{}的使用情况
Bottom
,但从事物的外观来看,我认为这不可能
因为几个原因而被迫工作。
最重要的原因很简单:std::vector<Node>
可以
仅包含Node
类型的对象。 Top
类型的对象,
如果Middle
和Bottom
将被切片(转换为Node
)
插入,所以你松散派生类型。
你不能做struct Top : public
std::vector<Top>
之类的东西(不是我认为那是你想要的),因为
你不能在不完整的类型上实例化一个向量
无法从未经实例化的模板派生。
通常的解决方案是创建一个Tree
类,然后使用
节点中的std::vector<Node*>
(作为成员,而不是通过
遗产)。或者,您可以使用Boost的指针向量
(但要小心对象的生命周期),或者如果你知道的话
你永远不需要后退指针,你可以使用
std::vector<std::unique_ptr<Node>>
(但界面变为
有点棘手,你还需要小心
对象的生命周期 - 从树中删除对象
摧毁它。)