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 Symbol

    bitte um Hilfe,
    Lg Marco

    Der 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


  • Administrator

    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


  • Administrator

    Hast du die Definition der Konstruktoren auch in den Namensraum NavalWar gesteckt?

    Grüssli



  • Dravere schrieb:

    Hast du die Definition der Konstruktoren auch in den Namensraum NavalWar gesteckt?

    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 CShip ist 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?


  • Administrator

    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


Anmelden zum Antworten