0
void function(typeA* ptr_to_A) {
  if (!ptr_to_A) {
    typeB B; // typeB is a derived class of typeA
    ptr_to_A = &B;
  }
  do_stuff_to_ptr_to_A(ptr_to_A);
  // my hope is that B is still in scope here so that this function will operate on my B object (which is on the stack) which only gets created if ptr_to_A was initially NULL
}

この関数は、私が思っていること (私がやりたいこと) を実行しますか? つまり、引数がヌル ポインターの場合にのみスタックに B を割り当てますか?

4

2 に答える 2

1

この機能は、私が思っていることをしますか?

Bいいえ、範囲外になるため未定義の動作です。これは未定義の動作であるため、何かが起こる可能性があるため、結果を予測することはできません。B少なくとも関数呼び出しと同じスコープを維持したいので、メソッドの先頭に移動するだけです:

void function(typeA* ptr_to_A) {
   typeB B; // typeB is a derived class of typeA
   if (!ptr_to_A) {
      ptr_to_A = &B;
   }
   do_stuff_to_ptr_to_A(ptr_to_A);
}

typeBただし、 if is nullのみを割り当てたい場合は、次のptr_to_Aようにすることができます。

void function(typeA* ptr_to_A) {
  if (!ptr_to_A) {
    typeB B; // typeB is a derived class of typeA
    do_stuff_to_ptr_to_A(&B);
  } else {
    do_stuff_to_ptr_to_A(ptr_to_A);
  }
}
于 2012-10-17T01:07:13.763 に答える
0

中括弧内で typeB の B を宣言しています。これは、その条件付き if ステートメント内でのみ有効になることを意味します。つまり、範囲外になります。if ステートメントの前に B を宣言します。B は、ptr_to_A が null の場合にのみ割り当てられます。関数 "function()" から ptr_to_A を渡すつもりなら、B が関数ローカルであるため、問題が発生します。

于 2012-10-17T01:04:34.593 に答える