2009-09-30 19 views
6

çocuk sınıfta sanal yöntemi çağırmak ++. B sınıfında inner->doSomething()'u aramak için ne yapmalıyım?C i aşağıdaki sınıfları

şimdiden teşekkürler.

+3

İç kısım kullanırken bir segfault alırsanız, büyük olasılıkla geçerli bir nesneyi işaret etmemesi olasıdır. İç B'yi nasıl başlatırsınız? –

+0

Her A bir A * içerir. Gerçekten mi? Niye ya? –

+0

Tamam, birbirlerine bakıyorlar. Sadece kontrol etmek istedim. –

cevap

9

İç öğenin açık bir şekilde başlatılması olmadan, her ikisinin de NULL olmaması ve geçersiz belleğe yönlendirilmesi mümkündür. Bize içsel olarak inaktif olan kodu gösterebilir misin?

A için uygun bir yapıcı ... Aşağıdaki

protected: 
A() : inner(NULL) { 
    ... 
} 
+1

JaredPar'ın önerisine alternatif olarak, yapıcıda şunu belirtin: inner = NULL. Alt sınıfın doSomething() içine breakpoint yerleştirin ve iç değerini gözlemlemek? – Calyth

+2

başlatılamadı, beklediğimden NULL ve if ifadesi yanlış olur. Bir nesnenin hem NULL olmayan hem de geçersiz belleğe işaret etmesinin mümkün olacağını bilmiyordum. Ben sadece yaptım = B Bütçede NULL ve sorunu çözdü. çok teşekkür ederim. – marcosbeirigo

+2

DİKKAT: tüm standart tipler için (imleçler, int, float, vs ... yerleşik tipler de denir), değişken inşa edildiğinde başlatılmaz ('Varsayılan Oluşturucu' yoktur). 'İçsel' A'nın bir özelliği olduğundan, A'nın kurucusunun onu başlatması sorumluluğu vardır, aksi takdirde her çocuk sınıfında probleminiz olur ... –

4

B Eğer bir yığın taşması alırsınız bu işaretçi başlatıldı aynı olacak şekilde A * atarsanız olsa olurdu Herhangi nedeni İçine mi ihtiyacınız var? A :: DoSomething() 'i çağırmaz mısın?

İlgili konular