2016-06-27 16 views
0

Newcomer in cpp hier, sei beraten, möglicherweise Dummheit voraus.Rückgabe statische Element für virtuelle Funktion, fehlende vtable für abstrakte Klasse

Ich habe versucht, eine statische Eigenschaft zurückzugeben, wenn eine virtuelle Funktion implementiert wird. Dies gibt einen Linkfehler aus, der besagt, dass die Funktion nicht implementiert wurde. Ich bin mit diesem Problem verloren.

konnte ich den Fehler mit dem folgenden abgespeckte Code reproduzieren:

#include <iostream> 
#include <map> 

class Abstract1 { 
public: 
    virtual char* getFoo(); 
}; 

class Base: public Abstract1 { 
public: 
    char* getFoo() { 
     return Base::mapper[1]; 
    } 
    static std::map<int,char*> mapper; 
}; 

std::map<int, char*> Base::mapper; 
int main(int argc, const char * argv[]) { 
    Base::mapper[0] = "Hello!\n"; 
    Base::mapper[1] = "Goodbye!\n"; 
    Base* hello = new Base(); 
    // insert code here... 
    std::cout << hello->getFoo() << "\n"; 
    return 0; 
} 

Nachgeben der folgenden Linkfehler:

Undefined symbols for architecture x86_64: 
    "typeinfo for Abstract1", referenced from: 
     typeinfo for Base in main.o 
    "vtable for Abstract1", referenced from: 
     Abstract1::Abstract1() in main.o 
+0

Sie müssen auch einen virtuellen Destruktor hinzufügen, wenn Sie aus einem 'Abstract1'-Zeiger löschen möchten. –

Antwort

1

Abstract1::getFoo ist einfach virtuell, nicht abstrakt.

Sie können es entweder abstrakt machen: virtual char * getFoo() = 0; oder eine Standardimplementierung bereitstellen.

+0

Das war's! Ich dachte, das sind die gleichen Dinge ... ich glaube ich lag falsch. Brauchen Sie mehr zu lernen! Vielen Dank! –

+0

np, übrigens ist der eigentliche Begriff [* pure virtual *] (http://en.cppreference.com/w/cpp/language/abstract_class) –