C ++设计模式建议

时间:2010-10-04 19:44:59

标签: c++ design-patterns

我想做以下,我正在写图谱库。我希望我的班级应该是模板。

template < typename T>
class Graph
{
}

此Graph类适用于另一个class Vertex

我应该如何设计此Vertex课程,以便我的任何团队成员都可以使用,而且我不必在class Graph

中更改我的实施

基本上我希望这个Vertex类提供一些成员函数,例如getWeightgetvisitedsetvisited

因此只要客户端具有这些函数,就可以使用类Graph类,因为它是

2 个答案:

答案 0 :(得分:1)

通常情况下,图表类没有太大作用,因为所有数据都在顶点或边缘(取决于哪些数据由对象表示 - 听起来像是你想要的顶点对象)。

所以,你可能有

template< typename T >
struct Vertex {
    bool visited;
    T data;

    vector< Vertex * > edges;

    size_t getWeight() const { return edges.size(); }

    bool getvisited() const { return visited; }
    void setvisited( bool v ) { visited = v; }
};

您可能希望图形玻璃拥有所有顶点,并在尝试销毁它时防止断开连接或循环问题。

template< typename T >
struct Graph {
    typedef Vertex< T > vertex_t;
    deque< vertex_t > vertices;

    vertex_t &get_vertex() {
        return * vertices.insert( vertices.end(), vertex_t() );
    }
};

...并使Vertex的构造函数为private,并将其friend设为Graph,以使Graph成为获取顶点的唯一方法。

答案 1 :(得分:0)

以下场景在定义Vertex界面时可能会有所帮助。它将使您能够预先定义签名,以便Graph能够编译以及让用户通过继承扩展Vertex以满足他们的需求(如果这是您的目标之一)。

// Interface only (i.e. pure virtual). The user must implement this method   
// but the signature is defined up front so Graph able to call it.  
class Vertex {
  public:
  virtual int getWeight() = 0;   
};

// Interface with a default implementation (i.e. virtual).  The default 
// implementation is provided by you but the user can override the 
// implementation if needed.
class Vertex {
  public:
  virtual int getWeight();
};

// Interface has a required implementation (i.e. non-virtual).  The user 
// should not override your implementation.
class Vertex {
  public:
  int getWeight();
};