2013-03-07 14 views
12

Viene visualizzato un errore davvero strano relativo alla mancanza di vtable per un determinato costruttore e distruttore di classe. Per favore aiutami a risolvere questo.C++ errore vtable mancante

simboli non definiti per l'architettura 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) 

codice frammento;

file h:

class A: public B 

    public: 
    A(); 
    ~A(); 

}; 

file cpp ..

A::A() 
{ 


} 

A::~A() 
{ 


} 
+0

alla fine della classe metti un ';' –

+3

NOTA: un vtable mancante di solito significa che la prima funzione membro virtuale non in linea non ha definizione. – Bingo

+0

l'ho fatto. Era solo uno snippet di codice così tipografico. – user1908860

risposta

1

tenta di aggiungere distruttore virtuale alla classe. CCNode contiene probabilmente alcuni metodi virtuali e il compilatore non è riuscito a farcela.

class MissionController: public CCNode 
    { 

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

È una struttura pubblica, dove possiamo vedere la definizione della classe CCNode? Vedi vtable for .. referenced from compile error xcode o forse http://www.parashift.com/c++-faq-lite/link-errs-missing-vtable.html per ulteriore aiuto.

7

Ah! Rimuginando su questo penso di ottenere ciò che sta accadendo. Scommetto che CCNode è un codice che appartiene a qualcun altro.

Qualsiasi funzione virtuale ereditata è anche virtuale nella classe derivata ... ed è pratica comune rendere virtuale il distruttore ... non si può realizzare che il distruttore sia virtuale.

Anche se si sta utilizzando il file di intestazione di qualcun altro, ma si è dimenticato di collegarsi al loro file oggetto, potrebbe causare questo errore, in quanto il linker mancherebbe del distruttore di CCNode.

4

Trovato, provando con l'esempio, ecco un exmaple.

class Shape{ 

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

virtual ~Shape(){}; 
}; 

Il compilatore lamentato

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 

La modifica è vuota o qualsiasi contenuto in riga all'interno {} accanto alla funzione virtuale

class Shape{ 

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

    virtual ~Shape(){}; 
}; 

Fondamentalmente, è non trovando la definizione della funzione per il funzioni virtuali non incorporate.