2011-10-19 8 views
0

私は、コンストラクタとデストラクタが吹き出しと刻みで書かれたクラスを持つプログラムを作成しました。テンプレートを使用した空のオブジェクトまたはクラス/空のタイプ

クラスには、私のメニューとして使用しているrun()関数が含まれています。メニューから、私はユーザーにオプションを1つ選択させてもらいたい。コンストラクターをテストする(クラスからインスタンスを作成する)。2.デストラクタをテストする(メインメニューの終了時にメニューを終了して破壊する)。

ここは私のジレンマです。

main()ではrun()関数を使用するためにクラスを作成してインスタンスを作成する必要があります。しかし、私はテンプレートを使用しています。すなわち、 Class<classType> classTypeRun

run()を使用できるようにインスタンスを作成するためには、classTypeを指定する必要があります。これはコンストラクタを呼び出しますが、これは望ましくありません。私は、ユーザーがメニューから選択したときにコンストラクタを実行したいだけです。

これについて最も効率的な方法は何ですか?
run()関数のためだけに継承されたクラスを作成する必要がありますか?

+0

だから、この 'run'関数は' static'とテンプレートパラメータに依存しないのですか? –

+0

なぜ 'run()'がメンバ関数ですか?ユーザが(2)を選択したときにコンストラクタを実行させたい場合は、テンプレートクラスのメンバ関数ではできません。 – Chad

+0

K チャド:私はそれを見つけました。はい、それはメンバー関数であり、厳密にはそれを設定しているからです。しかし、私は明示的に呼び出すだけのメニューを追加しています。コンストラクタ/デストラクタ私はC/C++で上級者ではないことを心からお祈りします。 –

答えて

1

このように、run() free関数を作成します。

template <class T> 
    class MyT 
    { 
    public: 
    MyT(const T& v) : val_(v) {} 

    const T& get() const {return val_;} 
    private: 
    T val_; 
    }; 


    int run() 
    { 
    int opt; 
    cout << " 1) Create\n 2)Destroy\n"; 
    cin >> opt; 
    cin.ignore(); 
    return opt; 
    } 

    int main() 
    { 
    int opt = 0; 
    std::auto_ptr<MyT<int>> t; 

    do 
    { 
     // call the menu... 
     opt = run(); 

     // if the user selected option 1, and we haven't 
     // already constructed our object, do so now. 
     // (Calls MyT<int>()) 
     if(opt == 1 && !t.get()) 
      t.reset(new MyT<int>(10)); 

     // if the user selected option 2 and we have 
     // already constructed our object, delete it now 
     // (Calls ~MyT<int>()) 
     if(opt == 2 && t.get()) 
      t.reset(0); 
    } 
    while(2 != opt); 
    } 
+0

auto_ptrとreset要素は何をしているのですか?これは私には新しく、今ではそれを読んでいます –

+1

'std :: auto_ptr'はスマートポインタです。 'MyT ')が動的に割り当てられています。 – Chad

+0

非常に良い。私はauto_ptrとそのメンバ関数について早く知りたがっていればいいと思う!私はこれを実装してみましょう、私は戻って報告します。 –

関連する問題