2009-06-11 16 views
26

Escribí un método (que funciona bien) para a() en una clase. Quiero escribir otro método en el que la clase que llama el primer método modo:Llamando a un método desde otro método en la misma clase en C++

void A::a() { 
    do_stuff; 
} 

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

supongo que sólo podía reescribir b() por lo b(A obj) pero yo no quiero. En Java puedes hacer algo como this.a().

Quiero hacer obj.b() donde obj.a() se llamaría como resultado de obj.b().

+2

¿Puede aclarar qué es lo que quiere? –

+0

¡Oh, gritos! Tuve un error diferente causando esto, que acabo de solucionar. – devin

+2

asegúrese de que a se define antes b, si b llama a –

Respuesta

4

Parece que el código que escribió en su bloque funcionaría bien. Solo asegúrate de tener los métodos a() y b() definidos correctamente dentro de tu clase.

2

Lo que ha escrito allí debería funcionar bien. En C++ si llama al a dentro de b y ambos son métodos de instancia de alguna clase A, entonces no es necesario que lo califique. Ambos a y b están en el alcance de cada uno.

29

Lo que tiene que funcionar bien. Puede utilizar "este" si usted quiere:

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

o

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

o

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

pero lo que tienen debe también trabajar:

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

me aparece un error: 'uso no válido de 'esto' en la función no miembro' –

+0

¿es una mejor práctica usar' esto' al hacer referencia a métodos/propiedades de ¿la clase? – gen

2

Hay un caso en el que podría tener resultados ligeramente inesperados . Es decir, si A::a() es virtual, obj tiene realmente el tipo DerivedFromA, y DerivedFromA :: a reemplaza A::a. En ese caso, la simple llamada a(); o la más detallada this->a(); no llamará a A :: a sino a DerivedFromA :: a().

Ahora, esto es probablemente intencionado, ya que la clase A declaró a() ser virtual. Pero si realmente no lo dice en serio, puede ignorar lo virtual escribiendo la llamada como

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