我定义了一个基类diggraph和一个继承类UnGraph:
class DiGraph
{
protected:
long V; // No. of vertices; Vertices are labelled from 0, 1, ... V-1.
vector<list<long>> adj; // Adjacency List of graph
public:
DiGraph(long V); // Constructor, initialize V and resize adj;
virtual void addEdge(long v, long w); // Add directed edge (v,w) to adj
vector<list<long>> getadjL (); // Returns the adjacency list
vector<vector<long>> getadjM (); // Computes and returns the adjacency matrix
};
class UnGraph: public DiGraph {
public:
void addEdge(long v, long w); // Add undirected edge i.e add (v,w) and (w,v)
};
我定义了多个函数,返回值(有时参数)为DiGraph,如:
DiGraph Kn (long n) { // Returns the complete graph on n vertices
DiGraph G(n);
for (long i = 0; i < n ; i++) {
for (long j = 0; j < n; j++)
G.addEdge(i, j);
}
return G;
}
现在我想要这些函数的'等效'版本的UnGraph(即相同的函数,除了'addEdge'的diggraph函数应该被'addEdge'的UnGraph函数所取代,类类型应该改变。我必须做这个函数的另一个副本(我所有的函数),还是有可能为基类和继承类写一个单一的函数?
我想使用函数模板,但后来意识到,如果你泛化类T,如:
template <typename T> T Kn (long n) { // Returns the complete graph on n vertices
T G(n);
for (long i = 0; i < n ; i++) {
for (long j = 0; j < n; j++)
G.addEdge(i, j);
}
return G;
}
,但后来意识到你不能在函数体中使用它的任何字段,如T.addEdge(u,v)。什么好主意吗?
只要你为UnGraph
提供一个接受long的构造函数,例如
UnGraph(long V) : DiGraph(V) {}
可以将Kn
实现为模板函数,以GraphType
为模板参数(如DiGraph
或UnGraph
):
template <typename GraphType>
GraphType Kn (long n) {
GraphType G(n);
for (long i = 0; i < n ; i++) {
for (long j = 0; j < n; j++)
G.addEdge(i, j);
}
return G;
}
,像
一样使用DiGraph completeDi = Kn<DiGraph>(4);
UnGraph completeUn = Kn<UnGraph>(4);
我可以编译。