注意:我之前詢問過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++知識未能提供的其他解決方案?
如果類的數量並不大,爲什麼不使用'的boost ::變種對象將被自動刪除'而不是自定義適配器?或者,您可以直接擦除類型並存儲通用指針和某種標籤。 – oakad
@oakad:'C'是一個抽象基類,提供了我關心的接口。 'B'是一個想要使用該接口的類。並不是所有的類都符合接口,但是'B'不應該關心那些不符合的類(我認爲這會玷污B的實現)。 – nneonneo
也許按''shared_ptr'來保存'C *',有時用默認刪除器構建,其他時候用不做任何刪除器構建? –