2017-01-04 2 views
0

私はグラフクラスGraphと優先クラスの2つのクラスPqueue1Pqueue2を持っています。どちらのプライオリティキューも、Pqueuei(Graph &g)という形式のコンストラクタを持ちます。ここで、i = 1,2の2つのコンストラクタがあり、いずれもDijkstraという形式のものです。形式はvoid Dijkstra(Node*)です。最短経路木はgに書き込まれます。関数は異なるクラスのメソッドへのポインタ

ここでは、いくつかの条件(密度がg)に応じて2種類の優先度キューを構築し、関連するDijkstraメソッドを呼び出す関数を記述します。

どうすればいいですか?

Iは、関数ポインタdijkについて考えたが、両方のクラスのメソッドであるので、私は、異なるそれらを呼び出す必要があるいずれかpq1.*dijk又はpq2.*dijkpq1タイプPqueue1等の目的です)。しかし、私は、あまり最適ではない、事前に両方の優先度のキューを構築しなければならないでしょう。

+1

これはCとどのように関連していますか?タグをスパムしないでください!あなたの質問は広すぎます。私たちはコンサルティング/個人指導のサイトではありません。 – Olaf

+1

共通の基本クラスから派生し、dijkstraメソッドを仮想化するには、両方のクラスが必要です。関数ポインタを含める必要はありません。 –

+2

これはポリモーフィズムによって解決される典型的な問題です:http://www.cplusplus.com/doc/tutorial/polymorphism/ –

答えて

0

実行時の多形性とコンパイル時の多形性という2つの一般的なアプローチがあります。ランタイム多型について

、仮想関数で基本クラスを定義します。

class queue_base { 
public: 
    virtual void Dijkstra(Node*) = 0; 
}; 

そのからあなたのキュークラスのそれぞれを導き出す:Pqueue2ため

class Pqueue1 : public queue_base { 
public: 
    void Dijkstra(Node*); 
}; 

と同様に。

さて、これらの種類のオブジェクトが基本型へのポインタによって対処することができます:テンプレート関数を記述し、コンパイル時のポリモーフィズムのために

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

あなたはこの関数を呼び出すことができますタイプNode*の1つの引数をとるDijkstraという名前の関数を持つ任意のタイプのオブジェクトを使用します。

Pqueue1 q1; 
Node node; 
do_dijkstra(q1, &node); 
Pqueue2 q2; 
do_dijkstra(q2, &node); 
+1

最初の例で1つのキューを構成するには、 'queue_base * qp = cond?新しいPqueue1:新しいPqueue2; ... delete qp; 'しかし、これは' queue_base'にも仮想デストラクタを持たせる必要があります。 – melpomene

関連する問題