2015-12-03 30 views
0

我打算做的事情:我有一個自己的容器結構。但是它不應該存儲所有元素,而只能存儲一些具有特殊屬性的元素,而其他元素可以從結構中的信息動態創建。過載[]複雜數據結構的C++操作符

因此,我有一個插入(ITEM * i)方法,用於檢查是否需要明確存儲,然後存儲到地圖中,還是可以動態重構它。然後只存儲該項目添加的信息。

同爲一個項目*獲取(項目索引IDX)方法。它檢查是否明確存儲了屬於idx的ITEM。如果是,則從內部映射中讀取並返回指針。如果它已註冊但隱式存儲,則ITEM將動態創建並返回。

爲了與代碼中的其他結構兼容,我計劃重載[]運算符,但我不知道如何處理這個問題,或者如果這對於這個更復雜的結構甚至是可能的。

是否有可能,如果是的話,怎麼樣? 在此先感謝!

更新 尼姆代碼的作品。但是我現在認識到了一個問題(儘管從一開始就很明顯......):如果get()找到一個條目,則該指針由[]返回。如果沒有存儲,則ITEM被構造並返回指針。但是RAM永遠不會被釋放,因爲使用容器的算法無法區分保存構造的ITEMS和刪除第二種。

+0

我會想象最簡單的方法是爲'operator []'返回'get(index)'。 – Nim

+0

嗨Nim, 是的,這似乎工作。但是我現在認識到了一個問題(雖然很明顯......):如果get找到一個條目,返回指針。如果沒有,則構造ITEM並返回指針。但是RAM永遠不會被釋放,因爲使用容器的算法無法區分保存構造的ITEMS和刪除第二種。 – user3572032

+0

@ user3572032你有沒有考慮過使用智能指針而不是裸指針?即。的unique_ptr <>。 – marcinj

回答

2

如果您想提供的operator []爲你的對象,你要回答你的自我,如果下面的代碼是有道理的:

 MyObj obj; 
/*1*/ obj[some_index] = new_object; 
/*2*/ Obj& some_object = obj[some_index]; 

什麼語義將是情況1 - 你說:應該插入一些值,但你添加新的數據insert(ITEM* i)(這裏沒有some_index提供),所以你應該禁止使用你的課程,因爲在1的情況下。

現在的情況2,在你的榜樣,你表明ITEM* get(ITEMINDEX idx),讓您的類客戶端代碼必須知道什麼是項目索引,所以看起來情況2將是確定的。

問題是IMO只與殼體1,並與運算符[]插入新的數據。如果你看看std::map容器,那麼你對上述兩種情況都沒有問題。您的課程的用戶將希望以類似std::map運算符[]的方式使用它,如果它的功能不同將導致混淆。

+0

嗨Marcin, 是的情況2是有趣的一個,因爲我在這種方式在大多數情況下使用其他容器,並可以更改插入適當的函數調用,如果讀訪問的作品。 – user3572032

1

C++類運算符是一個奇怪名稱的方法。它可以做任何你想做的事情,只要它有一個預期的奇怪的名字。在運營商[]的情況下,它看起來像

template <typename T> 
T& operator[](std::size_t idx)  { /* arbitrary code */ }; 

這是關於所有這一切真的。

該界面相當受限制。你會得到一個索引,並且需要產生一個對你的類的實例的引用作爲迴應。您可以返回一個關於賦值的異常點的引用,例如它在分配時會對通過內部指針訪問的數據結構進行一些檢查。沿着這條道路可能會有很多偶然的複雜性。