2015-05-22 17 views
86

Ben 2 sınıfları var. Kod derlendi ve çalıştırıldı, ancak segfault edildi.Ne anlama geliyor?</p> <pre><code>class base { virtual void foo() {}; }; class derived : public base { void foo() { base::foo(); } }; </code></pre> <p>Bir hata yaptım ve <code>base:foo();</code> yerine <code>base::foo();</code> yazdı:

Google'ı nasıl kullanabileceğimi bilmiyorum ve ne olduğunu bilmiyorum, ama çok ilgileniyorum: Bu ne anlama geliyor?

base:foo(); 

o önemli ise

:

class base : public QAbstractGraphicsShapeItem 
+31

Bu bir [etiket] (http://en.cppreference.com/w/cpp/language/goto). – chris

+19

Bu, uyarıları açmanın yardımcı olduğu bir durumdur, bkz. [Canlı] (http://melpon.org/wandbox/permlink/ey2lvaSxYPlkjsXG) ... 'uyarı: 'base' etiketi tanımlanmış ancak kullanılmamıştır [-Wunused-label ] '... belki de bu soruyu bir soru sayfasına eklemeliyiz: * Uyarıları açmayı denediniz mi * –

+6

Yığın taşmasıyla sona erdi. Ne kadar uygun! –

cevap

117
void foo() { base:foo(); } 

eşdeğerdir:

void foo() 
{ 
    base: // An unused label. 
    foo(); // Calls the function again, resulting in infinite recursion. 
} 

nedeniyle sonsuz özyinelemeye, fonksiyon yığın taşmasına neden olur.

+1

evet, çağrı yığınında 'foo()' birçok çağrısını gördüğümde bu hatayı buldum. Teşekkürler – railmisaka

+0

Bunun için gcc/clang vb. – nonsensation

+9

@Serthy, '-Wall' kullandığımda, uyarı iletisini alıyorum: * socc.cc: 3: 4: uyarı: 'base' etiketi tanımlanmış ama kullanılmıyor [-Wunused-label] base: // Kullanılmamış etiketi. * –

İlgili konular