2010-11-29 140 views
0

我正在定義一個具有私有成員指向模板類的類的類。我有一個關於這樣的課程設計的問題。更確切地說,外部類是否應該被模板化。 因爲,我正在初始化外部類的構造函數中的私有成員,我想,這樣做是正確的。還有其他的選擇嗎? 一類聲明的例子如下,所有建議都歡迎:設計嵌套模板類

#include <foo.h> 
#include <bar.h> 

template < class FOO_TYPE, class BAR_TYPE > 
class OuterClass{ 
    public: 

     OuterClass(){ 
      this->m_pFoo = new CFoo<FOO_TYPE>(); 
      this->m_pBar = new CBar<BAR_TYPE>(); 
      this->m_nMyInt = 0; 
     } 

     template < class FOO_TYPE > 
     CFoo<FOO_TYPE> * processFoo(); 

     template < class BAR_TYPE > 
     CBar<BAR_TYPE> * processBar(); 

     ~OuterClass(){ 
      delete this->m_pFoo; 
      delete this->m_pBar; 
     } 

    private: 
     int m_nMyInt; 
     CFoo<FOO_TYPE> * m_pFoo; 
     CBar<BAR_TYPE> * m_pBar; 
}; 

回答

1

這取決於外部類的預期使用情況。您的代碼建議OuterClass可以與不同的模板類型一起使用,因此將它作爲模板也是有意義的。實際上,這種模板參數轉發非常普遍。

但是,如果您更希望OuterClass使用的CFooCBar只有特定的模板特化,那麼你可以在相應的會員申報所需FOO_TYPEBAR_TYPE

1

您的類中的processFoo()和processBar()被錯誤地定義。

它們不是類中的模板函數,它們是專門輸入到第1個和第2個模板參數中的。

CFoo和CBar看起來是外部模板。

你的班級在複製構造和賦值方面也失敗了「3規則」,如果CBar的構造函數拋出(在這種情況下你的構造函數會拋出,你的析構函數永遠不會被調用, m_pFoo永遠不會被刪除)。

+0

+1「3的規則」,我不能相信我錯過了。 – Mephane 2010-11-29 14:48:55