Co znaczy?


92

Mam 2 zajęcia:

class base {
    virtual void foo() {};
};

class derived : public base {
    void foo() { base::foo(); }
};

Popełniłem błąd i base:foo();zamiast tego pisałem base::foo();. Kod został skompilowany i uruchomiony, ale posegregował.

Nie wiem, jak mogę to wygooglować i nie wiem, co to jest, ale jestem bardzo zainteresowany: co to oznacza?

base:foo();

Jeśli to ważne:

class base : public QAbstractGraphicsShapeItem

32
To jest etykieta .
chris

20
Jest to przypadek, w którym pomaga włączenie ostrzeżeń, zobacz je na żywo ... warning: label 'base' defined but not used [-Wunused-label]... być może musimy dodać tę stronę z pytaniami: Czy próbowałeś włączyć ostrzeżenia
Shafik Yaghmour

6
Skończyło się to przepełnieniem stosu. Jak dobrze!
Laurent LA RIZZA

Odpowiedzi:


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

jest równa:

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

Ze względu na nieskończoną rekurencję funkcja powoduje przepełnienie stosu.


1
tak, znalazłem ten błąd, kiedy zobaczyłem wiele callów foo()na stosie call. dzięki
railmisaka

czy są dostępne ostrzeżenia w gcc / clang itp.?
nonsensation

10
@Serthy, Kiedy używam -Wall, otrzymuję komunikat ostrzegawczy: socc.cc:3:4: ostrzeżenie: etykieta „podstawowa” zdefiniowana, ale nie używana [-Wunused-label] base: // Nieużywana etykieta.
R Sahu

10
@Serthy: IIRC Visual Studio ma ostrzeżenie „rekurencyjne na wszystkich ścieżkach kontrolnych”.
MSalters
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.