web-dev-qa-db-ja.com

C ++で同じクラスの別のメソッドからメソッドを呼び出す

クラスでa()のメソッドを作成しました(正常に動作します)。そのクラスで最初のメソッドを呼び出す別のメソッドを書きたいので、

_void A::a() {
  do_stuff;
}

void A::b() {
  a();
  do_stuff;
}
_

b() so b(A obj)を書き換えることができると思いますが、したくありません。 Javaでthis.a()のようなことができますか?.

obj.b()を実行したい場合、obj.a()obj.b()の結果として呼び出されます。

30
devin

それがまさにあなたがしていることです。

23
ralphtheninja

あなたが持っているものは問題なく動作するはずです。次の場合は、「this」を使用できます。

void A::b() {
  this->a();
  do_stuff;
}

または

void A::b() {
  this->A::a();
  do_stuff;
}

または

void A::b() {
  A::a();
  do_stuff;
}

しかし、あなたが持っているものも動作するはずです:

void A::b() {
  a();
  do_stuff;
}
41
Eclipse

ブロックで作成したコードは問題なく動作するようです。クラス内でa()とb()の両方のメソッドが適切に定義されていることを確認してください。

4
Tim Rupe

わずかに予期しない結果になる可能性のあるケースが1つあります。つまり、A::a()が仮想であり、objが実際にDerivedFromA型を持ち、DerivedFromA :: aが_A::a_をオーバーライドする場合です。その場合、単純な呼び出しa();またはより冗長なthis->a();は、A :: aではなく、DerivedFromA :: a()を呼び出します。

クラスAはa()=を仮想と宣言しているため、これはおそらく意図されています。しかし、実際にそれを意味しない場合は、次のように呼び出しを記述して仮想を無視できます。

_void A::b()
{
    A::a(); // or
    this->A::a(); //Both ignore the virtual-ness of a()
}    
_
2
MSalters

そこに書いたものはうまくいくはずです。 C++では、a内でbを呼び出し、両方がいくつかのクラスAのインスタンスメソッドである場合、修飾する必要はありません。 abは両方とも互いのスコープ内にあります。

2
Todd Gamblin