我對圖形下面的類層次結構:類繼承層次的設計問題
typedef vector<int> ArrayI;
typedef vector<Array<long>> Mat2DB;
typedef vector<ArrayI> adjList;
class baseGraph {
int nodes;
ArrayI degree;
//some member functions.
}
class matGraph: public baseGraph {
Mat2DB matrix;
//member functions.
}
class lMatGraph: public matGraph {
ArrayI labels;
//member functions.
}
class listGraph: public baseGraph {
adjList list;
//member functions.
}
class lListGraph: public listGraph {
ArrayI labels;
//member functions.
}
在這個類
現在我有很多其他的功能,主要是虛擬的,所以,當我得到調用適當的功能同時使用基類指針。
例如我有一個功能sssp(int node)
它實現單一來源的最短路徑。 class matGraph
和class listGraph
分別是圖的鄰接矩陣表示和鄰接表表示。目前還沒有需要改變定義這些圖中標記的版本,所以我不lListGraph
和lMatGraph
重新定義這些功能現在,我就吃了唯一的問題是setLabel(const ArratI &)
在lListGraph
和lMatGraph
類。我需要這個函數是虛擬的,以便它通過基類指針被調用,但同時我沒有任何東西,例如matGraph
和listGraph
類的標籤。
我不知道我的設計層次結構是否正確,但對我來說似乎很直觀。所以對此的任何評論都會很好。我該怎麼做setLabel
函數。是否可以擁有這樣的功能(對我來說,這看起來像是一種解決方法,所以這個問題)還是我需要重新考慮我的類層次結構。
P.S .:我也很喜歡,如果有些書可以練習這些設計問題。我遇到了這些事情,不知道該怎麼辦。
編輯:
類圖形的使用在另一個類中clustering
其中我有一個構件baseGraph *graph
即
class clustering {
baseGraph *graph;
}
我存儲指針基類這裏,這樣我可以使用不同的用於算法(實現爲函數)從class graph
。對於集羣類,它又取決於我想要使用的圖表類型。
一定要記得'矢量'是專門爲所有其他標準容器不同(你可能已經預期這一點)。 –
@MarkB在我的原始實現中,我使用'vector'來對加權圖形進行建模,所以它很好,但很高興知道它的區別。在輸入我認爲使層次結構簡單的問題時。我將編輯該問題。 –
標籤是否需要能夠在運行時多次更改?或者它會在物體的整個生命中保持不變嗎? –