2009-06-11 19 views
26

Ich schrieb eine Methode (die funktioniert) für a() in einer Klasse. Ich möchte eine andere Methode in dieser Klasse schreiben, die die erste Methode ruft so:Aufruf einer Methode aus einer anderen Methode in der gleichen Klasse in C++

void A::a() { 
    do_stuff; 
} 

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

Ich glaube, ich nur b() so b(A obj) umschreiben könnte, aber ich will nicht. In Java können Sie etwas wie this.a() tun.

Ich möchte obj.b() tun, wo obj.a() würde als Ergebnis von obj.b() aufgerufen werden.

+2

Kannst du klarstellen was du willst? –

+0

oh whoops! Ich hatte einen anderen Fehler, der das verursachte - was ich gerade behoben habe. – devin

+2

stelle sicher, dass a vor b definiert ist, wenn b eine –

Antwort

4

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

2

Was Sie dort geschrieben haben, sollte gut funktionieren. In C++, wenn Sie a innerhalb b aufrufen und beide Instanzmethoden einer Klasse A sind, müssen Sie es nicht qualifizieren. Sowohl a als auch b sind in gegenseitigem Geltungsbereich.

29

Was Sie haben, sollte gut funktionieren. Sie können mit "this" wenn Sie wollen:

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 man haben sollte auch funktionieren:

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

aufruft, bekomme ich einen Fehler: 'ungültige Verwendung von 'this' in Nichtmitgliedsfunktion' –

+0

ist es eine bessere Praxis' this' zu verwenden, wenn Methoden/Eigenschaften referenziert werden die Klasse? – gen

2

Es gibt ein Fall, in dem Sie leicht unerwartete Ergebnisse haben könnten . Das heißt, wenn A::a() virtuell ist, hat obj tatsächlich den Typ DerivedFromA, und DerivedFromA :: a überschreibt A::a. In diesem Fall ruft der einfache Aufruf a(); oder der ausführlichere this->a(); nicht A :: a, sondern DerivedFromA :: a() auf.

Nun ist dies wahrscheinlich beabsichtigt, da Klasse A a() als virtuell deklariert. Aber wenn du es wirklich nicht so meinst, kannst du das virtuelle ignorieren, indem du den Anruf entweder als

schreibt
Verwandte Themen