哪个C++模式用于允许扩展其类的库?

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++世界中处理?

Ken*_*rom 1

我认为您希望模板类型成为您的晶格库不知道或不关心的“其他类型”。因此,您不必让用户从 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,要么涉及两个节点,所以我就不去管它了。