2009-08-03 45 views
1

我正在專門處理C++,但這實際上是與語言無關的。從對象中獲取項目集合的最佳實踐?

只是爲了給問題一些上下文......我有一個基於樹/圖的結構,其中每個節點擁有多個項目的集合。我有一個封裝了一些泛型集合(列表,地圖,矢量,LinkedList,無論)的類。我希望能夠以最有效的方式從該集合中獲取所有項目,而無需客戶端能夠編輯私有集合。

這裏是什麼,我有一個簡單的例子:

class MyClass 
{ 
public: 
    // Basic constructors and such 
    void AddItem(int item) { _myItems->push_back(item); } 

private: 
    list<int>* _myItems; 
}; 

所以,很顯然這檢索指針_myItems不起作用,因爲這將允許客戶端編輯_myItems一個getter。

嘗試1:
我可以創建一個新的列表,並返回一個指向一個不是......不過我不喜歡這個想法,創建和刪除現在說謊與不同對象的責任。

嘗試2:
我想這將是最好創建一些CopyTo從方法,如:

void CopyItemsToList(list<int>* inList) { // copy the items to client list } 

這樣,客戶端負責MEM管理的,很容易擴展這允許更多的數據結構。我的這種做法值得關注的是成本......這個列表可能會非常大,而且複製項目的成本能得到大

嘗試3:
而不是保持一個指針在類的列表,只需使用一個值類型並返回(讓複製構造函數處理它)。但是,這似乎性能成本將與#2相同...

反正,有什麼其他的方式去解決這個問題?讓我知道你們在想什麼......謝謝。

回答

6

Iterator pattern通常被認爲是一個合適的方法,以便將來自集合不可知論的元素列表展示給集合的實際內部表示。你可以創建你的迭代器,以便它返回只讀(const)引用,或者在請求時即時創建項目副本,而不是複製整個列表。

+0

const_terator然後,所以客戶端不能修改元素本身,如果這是要求。 – Eugene 2009-08-03 00:32:52

+0

正確;更新的答案是更清楚一點。 – Amber 2009-08-03 00:34:04

2

你可以將const引用返回給你的列表而不是指針(或者只是指向const)。客戶仍然可以強制轉換,但這會是他們自己的問題。

const list<int>& GetList() const { return *_myItems; } 
0

只返回列表的副本:

list<int> GetList() { return *_myItems; } 

不要過早優化。這是萬惡之源。