1

よく参照される変数があります。それは自動変数として始まりました。

ここで、コードの途中でdtorを呼び出して状態をリセットすることにしたので、割り当てを解除して再割り当てするつもりです。もちろん、これを行う標準的な方法は、deleteを呼び出して、新しいものを作成することです。

前:

void func() {
    ClassName varname; 
    while (varname.check()/*...*/) { if (varname.function()/*...*/) { /* bunches of code ... */
            /*... some more code ... */ 
        }
    } 
}

今私が欲しい:

void func() {
    ClassName varname; 
    while (varname.check()/*...*/) { if (varname.function()/*...*/) { /* bunches of code ... */
            if (key_code[SDLK_r]) { // Pressing R key should reset "varname"!
                /* Here I want to dealloc and realloc varname! */
                /* But if I declare varname as a ptr on line 2, */
                /* line 3 (rest of code) must be refactored. */
            }
        }
    } 
}

私の最初の試みは、2行目をこのようなものに変更することです

ClassName *varnamep = new ClassName();
ClassName& varname = *varnamep;

しかし、それが後で削除を呼び出して参照を再割り当てできるかどうかはわかりません。

                delete &varname; 
                varnamep = new ClassName();
                varname = *varnamep; // I assume compiler will error here because I can't reassign a ref. 

これを他の方法で行うことはできますか?それとも私はそれを吸い上げて、に変わるための検索交換を行うべきvarname.ですvarname->か?私の実際の実際の状況のこの特定のケースでは、おそらくメンバー関数を実装し、reset()この実際の問題について心配する必要はありません。しかし、参照をポインタとして効果的に処理できるようにするためのショートカットがあるかどうかを知りたいです(または、これはばかげたナンセンスであることが判明する可能性があります)

4

2 に答える 2

4

与えられClassName varnameて、あなたはこれを行うことができます:

varname.~ClassName();
new (&varname) ClassName;

しかし、私はそれをお勧めしません。これは、C ++のあまり知られていない2つの機能、明示的なデストラクタ呼び出しと新しい配置を使用します。これは、プロファイラーによって測定されたパフォーマンスに大きな違いがあり、ClassNameコンストラクターが例外をスローできない場合にのみ使用してください。

必要なことを実行する場合ClassName::operator=(または必要なことを実行するように変更できる場合)、次のように実行できます。

varname = ClassName();

これは、明示的なデストラクタ呼び出しの後に配置-newを使用するよりも簡単に理解できます。

別の一般的なイディオム:

varname.swap(ClassName());

これは、標準のコンテナのようClassNameに効率的な方法がある場合に機能します。swapこれは微妙なので、使用することにした場合はおそらくコメントに値します。

于 2012-07-03T05:42:26.230 に答える
2

標準的な方法は、新しいインスタンスを削除して作成しないことです。変数を再割り当てするだけです。

ClassName varname = .... ;

....

if (some condition) {
  varname = SomethingElse;
}

コピーコンストラクタ、代入演算子、およびデストラクタが、によって管理されるリソースを正しく処理することを確認してClassNameください。

于 2012-07-03T05:38:36.730 に答える