46 Stimmen

Das Aufrufen einer Methode aus einer anderen Methode in derselben Klasse in C++

Ich habe eine Methode geschrieben (die gut funktioniert) für a() in einer Klasse. Ich möchte eine andere Methode in dieser Klasse schreiben, die die erste Methode aufruft:

void A::a() {
  do_stuff;
}

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

Ich könnte b() wohl einfach so umschreiben: b(A obj), aber das möchte ich nicht. Kann man in Java so etwas wie this.a() machen?

Ich möchte obj.b() machen, wobei obj.a() als Ergebnis von obj.b() aufgerufen wird.

66voto

Eclipse Punkte 43775

Was du hast, sollte gut funktionieren. Du kannst "this" verwenden, wenn du möchtest:

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

oder

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

oder

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

aber was du hast, sollte auch funktionieren:

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

30voto

ralphtheninja Punkte 116647

Genau das machst du gerade.

5voto

Tim Rupe Punkte 4303

Es sieht so aus, als ob der Code, den Sie in Ihrem Block geschrieben haben, gut funktionieren würde. Stellen Sie nur sicher, dass sowohl die a() als auch die b() Methoden ordnungsgemäß in Ihrer Klasse definiert sind.

4voto

Todd Gamblin Punkte 56250

Was du dort geschrieben hast, sollte gut funktionieren. In C++ wenn du a innerhalb von b aufrufst und beide Instanzmethoden einer Klasse A sind, dann musst du es nicht qualifizieren. Sowohl a als auch b sind im Scope des jeweils anderen.

3voto

MSalters Punkte 166675

Es gibt einen Fall, in dem Sie möglicherweise etwas unerwartete Ergebnisse haben. Das ist, wenn A::a() virtuell ist, obj tatsächlich vom Typ DerivedFromA ist und DerivedFromA::a A::a() überschreibt. In diesem Fall wird der einfache Aufruf a(); oder der ausführlichere this->a(); nicht A::a, sondern DerivedFromA::a aufrufen.

Jetzt, dies ist wahrscheinlich beabsichtigt, da die Klasse A a() als virtuell deklariert hat. Aber wenn Sie es wirklich nicht wollen, können Sie das virtuelle ignorieren, indem Sie den Aufruf entweder so schreiben:

void A::b()
{
    A::a(); // or
    this->A::a(); //Beide ignorieren die Virtualität von a()
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X