jan*_*ver 5 c++ polymorphism design-patterns
我试图将我的C++模拟软件中的一些代码拆分成一个库,因此可以更灵活地使用它.模拟基于a Lattice,由许多Nodes 组成,其中包含指向其Neighbors 的指针列表.虽然邻居也是节点,但是我希望在*Node指针周围有一个小的包装类,以便实现额外的逻辑/字段(例如,bool is_neares_neighbor左右).
因此,我的类架构看起来像这样:
class Lattice {
private:
vector<Node> _nodes;
};
class Node {
private:
vector<Neighbor> _neighbors;
};
class Neighbor {
private:
Node * _node;
};
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.现在,我希望我的库能够处理所有与格相关的逻辑,但没有别的.然而,在一些项目中使用的库时,这三个类(Lattice,Node,Neighbor)将携带更多的逻辑和领域.因此,用户应该能够继承这些类并实现他/她的自定义内容,而库仍然处理所有必需的与格相关的逻辑.
建议的方法是什么?模板是否合适?在模板化的情况下,我的类层次结构将如下所示:
template<class N>
class Lattice {
private:
vector<N> _nodes;
};
template<class NN>
class Node {
private:
vector<NN> _neighbors;
};
template<class N>
class Neighbor {
private:
N * _node;
};
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,Node 并且Neighbor需要知道对方的类型,它是一个圆形的状态,我不知道如何处理在这里.此外,整个库必须存在于头文件中.
这些情况如何以最优雅的方式在C++世界中处理?
我认为您希望模板类型成为您的晶格库不知道或不关心的“其他类型”。因此,您不必让用户从 Node 派生,而是对所有类使用 template<class t_data> 。
您自己说过,Neighbor 是一个 Node,所以您应该能够根据 Node<t_data> 定义所有内容。
您还应该考虑如何构建晶格,以及如何返回有关它的信息。这是一个示例,我假设您通过让晶格类创建节点来创建晶格,并可以选择在创建时将它们连接到现有节点。
#include <vector>
#include <memory>
template<class t_data>
class SetOfNodes;
template<class t_data>
class Node {
public:
Node(t_data value, SetOfNodes neighbors) : _data(value), _neighbors(neighbors) {}
is_nearest_neighbor(const Node &other){
// is other in _neighbors?
// is other the closest neighbor?
return false;
}
private:
t_data _data;
SetOfNodes _neighbors;
};
template<class t_data>
class SetOfNodes {
public:
std::vector<std::shared_ptr<Node<t_data>>> _nodes;
};
template<class t_data>
class Lattice {
public:
SetOfNodes get_all_nodes();
void create_new_node(SetOfNodes neighbors);
private:
SetOfNodes _nodes;
};
Run Code Online (Sandbox Code Playgroud)
我不太理解 Neighbor,因为它要么是一个 Node,要么涉及两个节点,所以我就不去管它了。
| 归档时间: |
|
| 查看次数: |
157 次 |
| 最近记录: |