2013-03-07 22 views
12

Otrzymuję bardzo dziwny błąd związany z brakującym vtable dla danego konstruktora klasy i destruktora. Pomóż mi rozwiązać ten problem.C++ Brakujący błąd vtable

niezdefiniowane symbole dla architektury i386:

"vtable for A", referenced from: 
     A::A() in A.o 
     A::~MissionController() in A.o 
    NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. 
ld: symbol(s) not found for architecture i386 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Fragment kodu;

plik .h:

class A: public B 

    public: 
    A(); 
    ~A(); 

}; 

plik .cpp ..

A::A() 
{ 


} 

A::~A() 
{ 


} 
+0

na końcu klasy umieść ';' –

+3

UWAGA: brakujący vtable zazwyczaj oznacza, że ​​pierwsza nieinrzędowa funkcja wirtualnego elementu nie ma definicji. – Bingo

+0

Zrobiłem to ... to był tylko fragment kodu, więc literówka. – user1908860

Odpowiedz

1

Spróbuj dodać wirtualnego destruktora do swojej klasy. CCNode prawdopodobnie zawiera kilka wirtualnych metod, a twój kompilator nie poradził sobie z nim.

class MissionController: public CCNode 
    { 

     public: 
     MissionController(); 
     virtual ~MissionController(); 
    }; 

Czy jest to jakiś szkielet publiczny, gdzie możemy zobaczyć definicję klasy CCNode? Aby uzyskać dodatkową pomoc, zobacz vtable for .. referenced from compile error xcode lub może http://www.parashift.com/c++-faq-lite/link-errs-missing-vtable.html.

7

Ah! Zastanawiając się nad tym, myślę, że dostaję to, co się dzieje. Założę się, że kod CCNode należy do kogoś innego.

Wszystkie wirtualne funkcje, które dziedziczysz, są również wirtualne w klasie pochodnej ... i powszechną praktyką jest sprawianie, aby destruktor był wirtualny ... możesz nie wiedzieć, że destruktor jest wirtualny.

Również jeśli używasz cudzego pliku nagłówkowego, ale zapomniałeś połączyć się z jego plikiem obiektowym, może to spowodować ten błąd, ponieważ linker nie będzie zawierał destruktora z CCNode.

4

Znalazłem, próbując z próbką, oto przykład.

class Shape{ 

public: 
virtual int areas(); 
virtual void display(); 

virtual ~Shape(){}; 
}; 

Kompilator skarżył

Undefined symbols for architecture x86_64: 
"typeinfo for Shape", referenced from: 
    typeinfo for trian in main_file.o 
"vtable for Shape", referenced from: 
    Shape::Shape() in main_file.o 
    NOTE: a missing vtable usually means the first non-inline virtual member  function has no definition. 
    ld: symbol(s) not found for architecture x86_64 
    clang: error: linker command failed with exit code 1 (use -v to see invocation) 
    make: *** [cpp_tries] Error 1enter code here 

Modyfikacja jest pusty lub jakąkolwiek treść wbudowany wewnątrz {} obok funkcji wirtualnej

class Shape{ 

public: 
    virtual int areas(){}; 
    virtual void display(){}; 

    virtual ~Shape(){}; 
}; 

Zasadniczo, to nie znalezienie definicji funkcji dla nieinterline funkcje wirtualne.

Powiązane problemy