2017-01-04 79 views
0

我有一個圖類Graph和兩個類Pqueue1Pqueue2的優先級隊列。兩個優先級隊列都具有Pqueuei(Graph &g)形式的構造函數,其中i = 1,2並且它們都具有形式爲的方法Dijkstra。最短路徑樹被寫入g函數指針指向不同類的方法

現在我想寫一個函數,根據某些條件(密度爲g)構造兩種優先級隊列,然後調用相關的Dijkstra方法。

這怎麼辦?

我考慮一個函數指針dijk但由於兩者都是一類的方法我需要以不同的調用它們,或者pq1.*dijkpq2.*dijk(其中pq1Pqueue1類型等的目的)。但是,那麼我將不得不先建立兩個優先級隊列,這是不理想的。

+1

這和C有什麼關係?不要垃圾標籤!你的問題太廣泛了。我們不是諮詢/輔導網站。 – Olaf

+1

您需要兩個類從一個公共基類派生,並使dijkstra方法變爲虛擬。不需要涉及函數指針。 –

+2

這是一個典型的問題通過多態性解決:http://www.cplusplus.com/doc/tutorial/polymorphism/ –

回答

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

要在第一個示例中構造一個隊列,'queue_base * qp = cond?新的Pqueue1:新的Pqueue2; ...刪除qp;'但是這也需要'queue_base'有一個虛擬析構函數。 – melpomene

相關問題