2010-10-04 127 views
0

我想要做下面的事情,我在寫Graph庫。我想我的課應該是模板。C++設計模式暗示

template < typename T> 
class Graph 
{ 
} 

這Graph類適用於另一個class Vertex

我應該如何設計這個Vertex類,以便任何我的團隊成員都可以使用,我沒有改變class Graph

基本上我的實現我希望這個Vertex類提供幾個成員函數,如getWeight,getvisited,setvisited

所以只要客戶端具有這些功能,那麼類Graph類可以按原樣使用

+1

你看過Boost Graph嗎? http://www.boost.org/doc/libs/release/libs/graph – Potatoswatter 2010-10-04 19:48:40

+0

你的意思是'Graph '將使用特定的類'Vertex'作爲成員或方法參數?或者你的意思是'圖'應該被允許,只要'頂點'提供某些接口方法? – aschepler 2010-10-04 19:49:03

+0

是aschepler,這是我正在尋找。 – Avinash 2010-10-04 19:50:00

回答

1

通常,圖類沒有太大的作用,因爲所有的數據都在頂點或邊緣(取決於哪個由對象表示 - 這聽起來像你想要的頂點對象)。

所以,你可能有

template< typename T > 
struct Vertex { 
    bool visited; 
    T data; 

    vector< Vertex * > edges; 

    size_t getWeight() const { return edges.size(); } 

    bool getvisited() const { return visited; } 
    void setvisited(bool v) { visited = v; } 
}; 

您可能希望在圖形玻璃將自己所有的頂點,並試圖摧毀它時,防止斷線或週期的問題。

template< typename T > 
struct Graph { 
    typedef Vertex<T> vertex_t; 
    deque<vertex_t> vertices; 

    vertex_t &get_vertex() { 
     return * vertices.insert(vertices.end(), vertex_t()); 
    } 
}; 

...和做的Vertex私有的構造函數,和圖形及其friend,使Graph獲得頂點的唯一途徑。

0

在定義頂點界面時,以下情況可能會有所幫助。它將使您能夠預先定義簽名,以便Graph能夠編譯以及讓用戶通過繼承來擴展Vertex以滿足其需求(如果這是您的目標之一)。

// Interface only (i.e. pure virtual). The user must implement this method 
// but the signature is defined up front so Graph able to call it. 
class Vertex { 
    public: 
    virtual int getWeight() = 0; 
}; 

// Interface with a default implementation (i.e. virtual). The default 
// implementation is provided by you but the user can override the 
// implementation if needed. 
class Vertex { 
    public: 
    virtual int getWeight(); 
}; 

// Interface has a required implementation (i.e. non-virtual). The user 
// should not override your implementation. 
class Vertex { 
    public: 
    int getWeight(); 
};