我想做以下,我正在写图谱库。我希望我的班级应该是模板。
template < typename T>
class Graph
{
}
此Graph类适用于另一个class Vertex
我应该如何设计此Vertex
课程,以便我的任何团队成员都可以使用,而且我不必在class Graph
基本上我希望这个Vertex
类提供一些成员函数,例如getWeight
,getvisited
,setvisited
因此只要客户端具有这些函数,就可以使用类Graph
类,因为它是
答案 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();
};