C++

2009-06-11 8 views
26

'da aynı sınıftaki başka bir yöntemden bir yöntem çağırma Bir sınıfta a() için bir yöntem (iyi çalışıyor) yazdım. Ben bu yüzden ilk yöntemini çağıran bu sınıfta başka bir yöntem yazmak istiyorum:C++

void A::a() { 
    do_stuff; 
} 

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

Ben sadece b() yüzden b(A obj) yazabilirsiniz ama istemiyorum herhalde. Java'da this.a() gibi bir şey yapabilirsiniz.

obj.b()obj.b() sonucunda obj.a()'un çağrılması gereken obj.b() yapmak istiyorum.

+2

olarak çağrı ya yazarak sanal yok sayabilirsiniz? –

+0

oh whoops! Buna neden olan farklı bir hatam vardı - bu da düzeltildi. – devin

+2

emin olun bir tanımlanmaktadır b çağrısı yapıyorsa b önce bir –

cevap

4

Bu, bloğunuzda yazdığınız kodun düzgün çalışacağına benziyor. Sadece sınıfınızın içinde tanımlanan a() ve b() yöntemlerinin her ikisine de sahip olduğunuzdan emin olun.

2

Yazdıklarınız iyi çalışmalı. C++ 'da,içinde a'u çağırırsanız ve her ikisi de A bazı sınıfın örnek yöntemlerini kullanırsanız, o zaman onu nitelendirmeniz gerekmez. Her ikisi de a ve b her birinin kapsamı vardır.

29

Neler yapmalısınız?

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

veya

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

veya

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

ama ne de çalışması gerekir:

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

bir hata alıyorum: ' 'Bu' olmayan üyesi function' –

+0

o' arasında this' referans yöntemler/özelliklerini kullanmak için daha iyi bir uygulamadır geçersiz kullanımı sınıf? – gen

2

var Sen için "Bu" İstersen kullanabilirsiniz Biraz beklenmedik sonuçlara sahip olabileceğiniz bir durum . Yani, A::a() sanal ise, obj aslında DerivedFromA türüne ve DerivedFromA :: a geçersiz kılma A::a. Bu durumda, a(); basit çağrısı veya daha ayrıntılı this->a(); A :: a, ancak DerivedFromA :: a() işlevini çağırmaz. A sınıfı bir() sanal olarak ilan etmesinden bu yana

Şimdi, bu muhtemelen, amaçlanmıştır. Gerçekten gelmez Ama eğer istediğini açıklamak Can

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