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;
 };
4

2 に答える 2

1

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

これらはクラス内のテンプレート化された関数ではなく、1 番目と 2 番目のテンプレート パラメーターに対して具体的に型指定されています。

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

あなたのクラスはまた、コピー構築と代入に関して「3 のルール」に失敗しており、CBar のコンストラクターがスローした場合、例外セーフではありません (この場合、コンストラクターはスローし、デストラクタは決して呼び出されず、m_pFoo は決して取得されません)。削除されました)。

于 2010-11-29T14:42:57.600 に答える
1

それは、外部クラスの使用目的によって異なります。あなたのコードは、さまざまなテンプレート タイプで使用できることを示唆しているOuterClassため、それをテンプレートとして使用することも理にかなっています。実際、この種のテンプレート引数の転送は非常に一般的です。

ただし、 andOuterClassの特定のテンプレートの特殊化のみを使用したい場合は、対応するメンバーの宣言で目的のandを指定するだけです。CFooCBarFOO_TYPEBAR_TYPE

于 2010-11-29T14:32:51.213 に答える