我有一个图表类Pqueue1
和两个Pqueue2
和Pqueuei(Graph &g)
个优先级队列。两个优先级队列都具有i
形式的构造函数,其中1
= 2
,Dijkstra
,并且它们都具有方法void Dijkstra(Node*)
,其形式为:{ {1}}。最短路径树写入g
。
现在我想编写一个函数来构造两种类型的优先级队列,具体取决于某些条件(g
的密度),然后调用相关的Dijkstra
方法。
如何做到这一点?
我想到了一个函数指针dijk
,但由于两者都是类的方法,我需要以不同方式调用它们,pq1.*dijk
或pq2.*dijk
(其中pq1
是一个Pqueue1
等类型的对象。但是,我必须提前构建两个优先级队列,这是次优的。
答案 0 :(得分:0)
有两种常见的方法:运行时多态性和编译时多态性。
对于运行时多态性,使用虚函数定义基类:
class queue_base {
public:
virtual void Dijkstra(Node*) = 0;
};
然后从中派生每个队列类:
class Pqueue1 : public queue_base {
public:
void Dijkstra(Node*);
};
,同样适用于Pqueue2
。
现在可以通过指向基类型的指针来解决这些类型的对象:
Pqueue1 q1;
Pqueue2 q2;
queue_base* qp = &q1;
qp->Dijkstra();
qp = &q2;
qp->Dijkstra();
对于编译时多态,请编写模板函数:
template <class Q>
void do_dijkstra(Q& q, Node* n) {
q.Dijkstra(n);
}
您可以使用任何类型的对象调用此函数,该对象具有名为Dijkstra
的函数,该函数接受Node*
类型的一个参数:
Pqueue1 q1;
Node node;
do_dijkstra(q1, &node);
Pqueue2 q2;
do_dijkstra(q2, &node);