2009-06-11 9 views
26

J'ai écrit une méthode (qui marche bien) pour a() dans une classe. Je veux écrire une autre méthode dans cette classe qui appelle la première méthode si:Appel d'une méthode d'une autre méthode de la même classe en C++

void A::a() { 
    do_stuff; 
} 

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

Je suppose que je pourrais réécrire b() si b(A obj) mais je ne veux pas. En java pouvez-vous faire quelque chose comme this.a().

Je veux faire obj.b()obj.a() serait appelé à la suite de obj.b().

+2

Pouvez-vous clarifier ce que vous voulez? –

+0

oh whoops! J'ai eu une erreur différente provoquant ceci - que j'ai juste fixée. – devin

+2

assurez-vous que a est défini avant b, si b appelle –

Répondre

4

Il semble que le code que vous avez écrit dans votre bloc fonctionnerait très bien. Assurez-vous simplement que les deux méthodes a() et b() sont correctement définies dans votre classe.

2

Ce que vous avez écrit ici devrait fonctionner correctement. En C++ si vous appelez a au sein de b et les deux sont des méthodes d'instance de certains classe A, alors vous n'avez pas besoin de le qualifier. Les deux a et b sont dans la portée de l'autre.

29

Ce que vous avez devrait fonctionner correctement. Vous pouvez utiliser "cette" si vous voulez:

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

ou

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

ou

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

mais ce que vous avez devrait aussi travailler:

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

Je reçois une erreur: 'l'utilisation invalide de 'this' dans la fonction non-membre' –

+0

est-il une meilleure pratique d'utiliser' this' quand on fait référence aux méthodes/propriétés de la classe? – gen

2

Il y a un cas dans lequel vous pourriez avoir des résultats légèrement inattendus . C'est-à-dire si A::a() est virtuel, obj a réellement le type DerivedFromA et DerivedFromA :: a remplace A::a. Dans ce cas, l'appel simple a(); ou this->a(); plus prolixe n'appellera pas A :: a mais DerivedFromA :: a(). Maintenant, c'est probablement prévu, puisque la classe A a déclaré un() être virtuel. Mais si vous ne le pensez pas vraiment, vous pouvez ignorer le virtuel en écrivant l'appel soit comme

void A::b() 
{ 
    A::a(); // or 
    this->A::a(); //Both ignore the virtual-ness of a() 
}  
Questions connexes