基类和继承类上的函数的正确接口?



我定义了一个基类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为模板参数(如DiGraphUnGraph):

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);

我可以编译。

相关内容

  • 没有找到相关文章

最新更新