2010-11-29 13 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が異なるテンプレートタイプで使用できることを示唆しているので、それもテンプレートとして持つことは理にかなっています。実際、この種のテンプレート引数転送は非常に一般的です。

あなたはむしろOuterClassCFooCBarの唯一の特定のテンプレートの特殊化を使用したい場合は、その後、あなただけの対応するメンバーの宣言の中で希望FOO_TYPEBAR_TYPEを指定することができます。

1

クラス内でprocessFoo()およびprocessBar()が正しく定義されていません。

クラス内のテンプレート化された関数ではなく、第1および第2のテンプレートパラメータに型指定されています。

CFooとCBarは外部テンプレートのようです。

あなたのクラスもコピー作成と割り当てに関して "ルール3"に失敗していますが、CBarのコンストラクタがスローする場合は例外ではありません(コンストラクタがスローし、デストラクタが呼び出されず、 m_pFooは決して削除されません)。

+0

+1 "ルール3"では、私はそれを逃したとは思えません。 'processFoo'と' processBar'に関しては – Mephane

+0

ですが、そうです。外側のクラスがテンプレート化されていない場合にのみ表示されます。さらに、私はコード全体を入れていませんでしたが、あなたが正しいです、私はコピーコンストラクタと割り当てメソッドが必要です。 – Javier

関連する問題