Linkerfehler: Verweis auf nicht aufgelöstes Symbol; Problem bei den includes?!
-
Hallo Leute,
ich habe folgende 4 Klassen
class Ship, class Longboat -> von Ship abgeleitet, class shippart und class cannon -> von shippart abgeleitet.
es soll so ablaufen, dass ich im main ein neues "Longboat" erstelle -> dann wird im Konstruktor von Longboat eine "Cannon" mit
ship_parts_[0] = new CCannon(*(this), "irgendwelche Koordinaten", 10)erstellt. Es soll also die Referenz auf das Ship mitübergeben werden.
Die Konstruktoren von Shippart bzw. Cannon sehen so aus:
CShipPart::CShipPart(CShip &my_ship) : my_ship_(my_ship) CCannon::CCannon(CShip& my_ship, const CCoord& pos, int fire_range) : CShipPart(my_ship)Wenn ich die nun probier bekomm ich den oben erwähnten Linkerfehler.
Da ich vermute das ich bei den Includes ein Problem hab hab ich sie hier auch noch angeführt:
Ship.h: class CShipPart;
Ship.cpp: #include "CShip.h"
Longboat.h: #include "CShip.h" , #include "CCannon.h"
Longboat.cpp: #include "CLongboat.h"
Shippart.h: class CShip;
Shippart.cpp: #include "CShipPart.h"
Cannon.h: #include "CShipPart.h"
Cannon.cpp: #include "CCannon.h"
//hier sollte meiner meinung nach ein #include"Ship.h" eingefügt werden, doch dann bekomm ich 'CShip': Mehrdeutiges Symbolbitte um Hilfe,
Lg MarcoDer Vollständigkeit halber hier die gesamte Fehlermeldung:
"Fehler 1 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __thiscall NavalWar::CCannon::CCannon(class NavalWar::CShip &,struct NavalWar::CCoord const &,int)" (??0CCannon@NavalWar@@QAE@AAVCShip@1@ABUCCoord@1@H@Z)" in Funktion ""public: __thiscall NavalWar::CLongboat::CLongboat(struct NavalWar::CCoord const &,struct NavalWar::CCoord const &,int)" (??0CLongboat@NavalWar@@QAE@ABUCCoord@1@0H@Z)". CLongboat.obj SEP_EX2
"
-
Hallo
Sieht aus als hättest du vergessen, eine Funktion zu definieren oder eine Blockklammer zu setzen.
Mfg.
way
-
Der Linkerfehler besagt, dass der Linker keine Implementation, bzw. Definition, von den folgenden zwei Konstruktoren finden konnte:
`NavalWar::CCannon::CCannon(class NavalWar::CShip &,struct NavalWar::CCoord const &,int);NavalWar::CLongboat::CLongboat(struct NavalWar::CCoord const &,struct NavalWar::CCoord const &,int);`
Das hat also nichts mit Headern zu tun, sondern einfach damit, dass du vergessen hast, diese Konstruktoren zu definieren, ihnen also einen Rumpf zu geben.
Grüssli
-
Danke erstmal für die schnellen Antworten!
Dravere schrieb:
Das hat also nichts mit Headern zu tun, sondern einfach damit, dass du vergessen hast, diese Konstruktoren zu definieren, ihnen also einen Rumpf zu geben.
...ich hoff ich habe dich nicht falsch verstanden ... auf jeden fall habe ich meine Konstruktoren so definiert:
Shippart.h:
CShipPart(CShip &my_ship);Shippart.cpp:
CShipPart::CShipPart(CShip &my_ship) : my_ship_(my_ship){}Cannon.h:
CCannon(CShip &my_ship_, const CCoord& pos, int fire_range);Cannon.cpp:
CCannon::CCannon(CShip& my_ship_, const CCoord& pos, int fire_range) : CShipPart(my_ship_) { pos_ = pos; fire_range_ = fire_range; }Longboat.h:
CLongboat(const CCoord& start, const CCoord& end, int team);Longboat.cpp:
CLongboat::CLongboat(const CCoord& start, const CCoord& end, int team) { ship_parts_[0] = new CCannon(*(this), start_, 12); }...oder was hast du mit "Rumpf geben" gemeint?
...Bitte nochmal kurz drüberschaun ... vielen Dank!
Lg Marco
-
Hast du die Definition der Konstruktoren auch in den Namensraum
NavalWargesteckt?Grüssli
-
Dravere schrieb:
Hast du die Definition der Konstruktoren auch in den Namensraum
NavalWargesteckt?Ja, das hätt ich eigentlich gemacht.
Was auffält ist, dass ich mit der my_ship Instanze im CCannon auch nichts anstellen kann.
(Habe versuch mir irgendein public int rauszuholen - Compilerfehler: Verwendung des undefinierten Typs "CShip" und Links von ".my_number" muss sich eine Klasse/Struktur/Union befinden.)Ich weis nicht obs was damit zu tun haben kann...
LG
-
Hallo
Naja, sagt ja die Fehlermeldung bereits, worüber greifst du denn auf die public-variable zu? Mögliche Möglcihkeiten wären über nen Zeiger, Objekt...
Mfg.
way
-
gadei schrieb:
(Habe versuch mir irgendein public int rauszuholen - Compilerfehler: Verwendung des undefinierten Typs "CShip" und Links von ".my_number" muss sich eine Klasse/Struktur/Union befinden.)
Der Typ
CShipist nicht bekannt, vielleicht hast du dessen Klassendefinition nicht eingebunden.way schrieb:
Naja, sagt ja die Fehlermeldung bereits, worüber greifst du denn auf die public-variable zu? Mögliche Möglcihkeiten wären über nen Zeiger, Objekt...
Wie kommst du jetzt wieder auf sowas Abwegiges?
-
gadei schrieb:
Ja, das hätt ich eigentlich gemacht.
Sicher? Und wie? Wir hatten erst gerade letztens jemand, der das etwas anders gemacht hat, als es eigentlich üblich ist

Hast du auch nirgends vergessen die Klammern der Namensräume zu schliessen?
gadei schrieb:
Was auffält ist, dass ich mit der my_ship Instanze im CCannon auch nichts anstellen kann.
(Habe versuch mir irgendein public int rauszuholen - Compilerfehler: Verwendung des undefinierten Typs "CShip" und Links von ".my_number" muss sich eine Klasse/Struktur/Union befinden.)Dies hat wohl kaum was mit dem anderen Fehler zu tun. Das hat nun damit zu tun, dass du einen Header nicht eingebunden hast. Und zwar jener, in welchem CShip deklariert ist.
Grüssli