2011-02-23 33 views
7

我有一個名爲ABC類,它有一個類模板:C++採用指針模板對象

template <class T> class ABC{} 

在另一類我試圖對象的商店ABC中的列表:

class CDE{ 
private: 
    list<ABC *> some_list; 
} 

我打算存儲可能具有不同類模板參數的ABC對象。是否有必要在編譯時指定模板?如果容器應該存儲不同類型的對象呢?這不可能嗎?

回答

7

是否有必要甚至在編譯時指針指定模板?

是。

如果容器應該存儲不同類型的對象會怎麼樣?這不可能嗎?

它不是(直接)可能的。

有沒有這樣的事情,類ABC。只有ABC的實例化,例如ABC<Foo>ABC<Bar>。這些是完全不同的類。

你可以這樣做:

template<typename T> 
class ABC : public ABC_Base 
{ 
    ... 
} 

list<ABC_Base*> some_list; 

通過這樣做,你的所有ABC實例都有一個共同的基本類型,你可以任意使用基本指針。

+0

這聽起來很合理,有一點缺點。使用模板的全部原因是確保對象緊密耦合。這樣,仍然有機會創建沒有模板類型的ABC_Base(或其派生類)對象並在列表中使用它們。 – cyrux

+4

@cyrux如果你創建了'ABC_Base'抽象,那麼沒有人可以創建'ABC_Base'的對象。 – user470379

1

您需要在CDE類中指定模板參數,或者使CDE爲模板。

第一種選擇:

class CDE { 
private: 
    list< ABC<int>* > some_list; 
}; 

第二個選項:

template <class T> 
class CDE { 
private: 
    list< ABC<T>* > some_list; 
}; 
1

該列表只能存儲單個類型。模板的不同實例是不同的類型。如果這是令人滿意的,你可以做這樣的:

template <class T> class CDE{ private: list<ABC<T> *> some_list; }

如果您需要使用不同的類型,也許你可以創建一個ABC和存儲指向一個非模板基類。 (即使用接口)