2014-06-05 32 views
0

注意:我之前詢問過this question,它被迅速關閉爲重複。這個新的問題涉及到實際的設計,所以它不應該是這個問題的重複。在C++中實現匿名適配器實例

我有一個類B它採用類型爲C *(抽象基類)的單個參數。我控制B的定義。

我有一個鬆散的對象集合(閱讀:一堆成員變量在其他類)與各種接口(其中一些我不控制)。有些實施C,有些則沒有。我寫了一些適配器,它們擴展了C並提供了必要的功能。

現在我想構建一個B對象的實際集合。類似這樣的:

vector<B> bvec; 

bvec.emplace_back(&obj1.x); // obj.x implements C 
bvec.emplace_back(new YCAdapter(&obj2.y)); // obj.y doesn't implement C 
bvec.emplace_back(new ZCAdapter(&obj3.z)); // obj.z doesn't implement C 
... // 5-10 more of these 

通過在單個向量下收集這些不同的對象,我現在可以以一致的方式執行有用的操作。

但是,此代碼有明顯的內存泄漏,因爲適配器被泄露。這些都是非常小的類,幾乎沒有任何功能,我寧願不必保留這些適配器的列表,以便以後可以銷燬它們。

我該如何讓B可以容納指針或引用C對象,同時擁有和破壞適配器(但不包括C基類)?我應該從CAdapter與另一個基類間隔C嗎?或者我應該使用某種形式的智能指針?或者我有限的C++知識未能提供的其他解決方案?

+0

如果類的數量並不大,爲什麼不使用'的boost ::變種對象將被自動刪除'而不是自定義適配器?或者,您可以直接擦除類型並存儲通用指針和某種標籤。 – oakad

+0

@oakad:'C'是一個抽象基類,提供了我關心的接口。 'B'是一個想要使用該接口的類。並不是所有的類都符合接口,但是'B'不應該關心那些不符合的類(我認爲這會玷污B的實現)。 – nneonneo

+0

也許按''shared_ptr'來保存'C *',有時用默認刪除器構建,其他時候用不做任何刪除器構建? –

回答

0

你應該使用smart pointers

std::vector<std::shared_ptr<B>> v; 
v.push_back(std::shared_ptr{new X{}}); 
... 

時,其使用次數達到0

+0

那些已經是'C'的對象呢?那些屬於'B'外部的類... – nneonneo

+0

@nneonneo'shared_ptr'可以採用自定義釋放器,通過給它一個nop釋放器,它可以用於不屬於'B'的對象。雖然我認爲你應該重新考慮你的設計 –

+0

@BryanChen:重新考慮什麼?是的,這種設計不是最佳的,但我會改變它到什麼程度? – nneonneo