web-dev-qa-db-fra.com

Appel d'une méthode à partir d'une autre méthode de la même classe en C ++

J'ai écrit une méthode (qui fonctionne très bien) pour a() dans une classe. Je veux écrire une autre méthode dans cette classe qui appelle la première méthode ainsi:

void A::a() {
  do_stuff;
}

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

Je suppose que je pourrais simplement réécrire b() donc b(A obj) mais je ne veux pas. Dans Java pouvez-vous faire quelque chose comme this.a().

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

30
devin

C'est exactement ce que tu fais.

23
ralphtheninja

Ce que vous avez devrait bien fonctionner. Vous pouvez utiliser "ceci" si vous souhaitez:

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 fonctionner:

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

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

4
Tim Rupe

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 en fait le type DerivedFromA et DerivedFromA :: a remplace A::a. Dans ce cas, le simple appel a(); ou le plus verbeux this->a(); n'appellera pas A :: a mais DerivedFromA :: a ().

Maintenant, cela est probablement prévu, car la classe A a déclaré que a() était virtuel. Mais si vous ne le pensez vraiment pas, 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()
}    
2
MSalters

Ce que vous y avez écrit devrait bien fonctionner. En C++ si vous appelez a dans b et que les deux sont des méthodes d'instance d'une classe A, vous n'avez pas besoin de la qualifier. a et b sont dans la portée de l'autre.

2
Todd Gamblin