2009-06-11 17 views
26

Ho scritto un metodo (che funziona correttamente) per a() in una classe. Voglio scrivere un altro metodo di quella classe che chiama il primo metodo così:Chiamare un metodo da un altro metodo nella stessa classe in C++

void A::a() { 
    do_stuff; 
} 

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

Suppongo che ho potuto solo riscrivere b() così b(A obj) ma io non voglio. In Java puoi fare qualcosa come this.a().

Voglio fare obj.b() dove obj.a() si chiamerebbe come risultato di obj.b().

+2

Puoi chiarire cosa vuoi? –

+0

oh whoops! Ho avuto un errore diverso causando questo - che ho appena risolto. – devin

+2

assicurati che sia definito prima di b, se b sta chiamando un –

risposta

18

Questo è esattamente quello che stai facendo.

4

Sembra che il codice scritto nel blocco funzioni correttamente. Assicurati di avere entrambi i metodi a() e b() definiti correttamente nella tua classe.

2

Quello che hai scritto lì dovrebbe funzionare bene. In C++ se si chiama a all'interno di b ed entrambi sono metodi di istanza di alcune classi A, quindi non è necessario qualificarlo. Entrambi a e b sono l'uno nell'altro.

29

Quello che devi funzionare correttamente. È possibile utilizzare "questo", se si vuole:

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

o

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

o

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

, ma quello che hai dovrebbe anche funzionare:

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

Ricevo un errore: 'uso non valido di 'questo' nella funzione non membro ' –

+0

è una pratica migliore usare' questo' quando si fa riferimento a metodi/proprietà di la classe? – gen

2

C'è un caso in cui potresti avere risultati leggermente inaspettati . Questo è se A::a() è virtuale, obj ha effettivamente il tipo DerivedFromA e DerivedFromA: un override A::a. In tal caso, la semplice chiamata a(); o la più dettagliata this->a(); non chiamerà A :: a ma DerivedFromA :: a().

Ora, questo è probabilmente inteso, poiché la classe A ha dichiarato a() di essere virtuale. Ma se davvero non lo intendi, puoi ignorare il virtuale scrivendo la chiamata come

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