2013-03-07 8 views
7

Übersicht der Klassen usw. meiner Schnittstelle!C++: Fehler LNK: nicht aufgelöstes externes Symbol, resultierend aus virtuellen Funktionen

Animal.H:

class Animal 
{ 
public: 
    virtual void walk(); 
} 

Animals.CPP

EMPTY =

Cow.H:

class Cow : public Animal 
{ 
public: 
    virtual void walk(); 
} 

Hier sollte es outomatisch wissen, dass die Funktion walk aus der Klasse genommen wird, von der sie abgeleitet ist, oder? (zB Tier ..) wenn ich den Funktionsweg nicht definieren würde, sollte er sagen, dass ich es richtig definieren sollte ...?

Cow.CPP:

void Cow::walk() 
{ 
    //do something specific for cow 
} 

SomeOtherClass.H

namespace SomeNamespace 
{ 
    void LetAnimalWalk(); 
} 

SomeOtherClass.CPP

Cow myCow; 
namespace SomeNamespace 
{ 
    void LetAnimalWalk() 
    { 
     myCow.walk(); 
    } 
} 

Thi s sollte funktionieren? ... ich meine, der namespace, die "Class :: ..." sachen? und wie ich die Schnittstelle vererbe und benutze?

Weil diese Weise kann ich mit jeder Funktion bekomme ich von der Schnittstelle gemacht, so dass jede virtuelle Funktion mir die folgende Störung gibt:

SomeOtherClass.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall Cow::Walk (...etc etc...) referenced in function "void __cdecl SomeNamespace::LetAnimalWalk() (...etc etc...) 

Weiß jemand, was ich falsch mache, was ich meistens finde ist, dass es bedeutet, dass ich erklärt habe (irgendwo in Cow.cpp ??)

Vielen Dank im Voraus Jungs eine Funktion direkt nicht

+2

Ist 'myCow.Walk();' ein Tippfehler? Die Funktion heißt 'walk()' (Kleinbuchstaben) –

+0

Oh ja, das ist ein Tippfehler ... Ich habe das hier nur von Hand eingegeben, die echte Klasse ist etwas schwierig, aber ich dachte, würde zu spezifisch für Stackoverflow werden. .! –

+0

@AndyProwl Sie versucht, mir gestern auch zu helfen, auf der gleichen Art Frage, die spezifischer Andy war .. ich antwortete, aber denke nicht, dass Sie es gelesen haben ... mein anderer Posten war: http://StackOverflow.com/ Fragen/15226986/c-lnk-error-2019-ungelöst-external-symbol-virtual-errors-wegen-eines-inter # comment21465084_15226986 –

Antwort

9
class Animal 
{ 
public: 
    virtual void walk(); 
} 

Sie müssen diese Funktion definieren oder machen es ist rein virtuell.

+0

Aber es ist virtual richtig? Also, wenn ich eine Kuh mache, gehe ich .. ich definiere es .. oder? –

+0

Wenn die Basisklassenfunktion nicht rein virtuell ist, müssen Sie sie auch in der Animal-Klasse definieren. Wenn es in Animal rein virtuell ist, müssen Sie es nur in Cow definieren. Auch virtuelle Funktionen werden normalerweise mit Zeigern zu Basisklassen verwendet, zB 'Animal * animal = new Cow(); animal-> walk(); 'das würde die Walk-Funktion in der Kuhklasse heißen. –

+0

Hmm, das habe ich jetzt auch probiert ..! Es ist sicher besser, es auf diese Weise zu verwenden, aber immer noch bleiben die gleichen Fehler ...... –

4

Wenn Sie eine virtuelle Funktion, die Sie wollen nicht in der Basisklasse zu definieren, müssen Sie es abstrakt machen, dies getan wird, um die folgende Syntax verwendet:

class Animal 
{ 
public: 
    virtual void walk() = 0; 
} 

Ohne diese Sie erhalten ein Fehler, wenn es nicht definiert ist, und damit erhalten Sie einen Fehler, wenn eine abgeleitete Klasse es nicht definiert.

+0

Ahh mein Schlechter, ich habe sogar das ...! so war es schon rein virtuell .. hab aber immer noch den gleichen fehler! –

2

entweder, um die Funktion in der Basisklasse rein virtuelle:

class Animal 
{ 
    public: 
     virtual void walk() = 0; 
} 

oder eine triviale Implementierung definieren:

void Animal::walk() 
{ 
    return; // could also throw an exception here 
} 
+0

Ich habe es sogar definiert, wie du gesagt hast, diese triviale Implementierung (ich habe es rein virtuell gemacht, ich habe die Implementierung definiert, ich habe beides gleichzeitig gemacht ... aber mein Fehler bleibt gleich –

+0

Ja, ich sehe, du hast die Frage geändert Entschuldigung, Ihr Code ist offensichtlich vereinfacht, also gehe ich davon aus, dass Sie alle fehlenden 'include'-Direktiven haben (sonst sollten Sie vor der Link-Phase einen Fehler bekommen). Welche Entwicklungsplattform verwenden Sie? Bist du sicher, dass 'Cow.cpp' Teil deines Projekts oder Makefiles ist? – jerry

+0

Ich benutze VS2012 ... und in der Tat, inkludiert habe ich hier wirklich keine Frage! Ehm, Cow.cpp soweit ich gesehen habe ist ein Teil der Lösung .. Ich werde sicher gehen in der Tat Ja mein VS2012, sagt nur, dass es in Projekt enthalten ist!!: \ –

1

Animal * = new animal Kuh(); Tier-> Spaziergang();

Kuh myCow funktioniert offensichtlich nicht!

+0

Calling 'Walk()' direkt auf einem 'Kuh' Objekt in der Tat shou ld Arbeit (keinen Linker Fehler geben).Der Grund, warum Sie normalerweise eine virtuelle Funktion über einen Zeiger aufrufen, ist sicherzustellen, dass sie tatsächlich virtuell aufgerufen wird (ich habe ein schnelles Beispiel unter http://ideone.com/UteSxT geschrieben). Die Tatsache, dass dies dein Problem behoben hat, sagt mir, dass da noch etwas anderes vor sich geht. – jerry