我有不同的類型,說A
,B
,C
,所有的一些基礎類Base
繼承:這個容器的最簡潔的實現是什麼類型的容器?
class Base { ... };
class A : public Base { ... };
class B : public Base { ... };
class C : public Base { ... };
我需要一個容器,我們稱之爲Master
,持有指針的類型A
,B
對象和C
。我希望Master
容器提供一個覆蓋所有包含Base
對象的迭代器,以及包含所有包含的A
,B
和C
對象的特定類型的迭代器。作爲存儲後端,我將使用std::vector
,但如果稍後可以輕鬆切換,那將會很不錯。
從概念上講,這是Master
應該呈現給外界的接口:
class Master {
public:
add(A *a);
add(B *b);
add(C *c);
remove(Base *base);
iterator<A*> a_begin();
iterator<A*> a_end();
iterator<B*> b_begin();
iterator<B*> b_end();
iterator<C*> c_begin();
iterator<C*> c_end();
iterator<Base*> base_begin();
iterator<Base*> base_end();
// also: reverse iterators, const iterators, reverse const iterators
};
接口不必匹配這個精確的語法。例如,someMaster.begin<A>()
也很好。
問題是,即使在這個簡化的界面中,您已經可以看到一些代碼重複的發生。在實施中更糟糕。這是不可接受的,因爲如果我想添加類D
,E
和F
(也繼承自Base
),我希望能夠稍後容易地擴展Master
容器。我最好用一行或兩行代碼來擴展它。
所有這些都可以用很多dynamic_cast
ing來實現,但這很醜陋。我認爲模板和多繼承的一些魔法可以幫助我在這裏。這個班最乾淨的實施是什麼?
容器中元素的順序是否相關?特別是,通過'base_begin()'和'base_end()'迭代的元素的預期順序是什麼?元素可以按類型重新排序嗎? – 2010-07-05 08:57:15
如果您打算將A,B和C視爲不同類型而不是Base *,那麼它就會破壞多態性。 – Puppy 2010-07-05 09:30:24