undefined reference to constructor



  • Hallo !

    Ich spiele gerade mit Vererbung herum, ich habe eine abstrakte Klasse A, Klasse B erbt von A, will ich den Konstruktor von B aufrufen, kommt die Fehlermeldung undefined refernce to B::B()

    ?????

    Der Konstruktor wurde definiert, und die Datei liegt im richtigen Ordner was mach ich falsch ?

    Bitte um Hilfe !!

    hier der Code:

    //Die Definition der Klassen:
    
    class wrAbstractNode {
    
        public:
    
        wrAbstractNode();
        virtual ~wrAbstractNode();
    
        virtual void add(int n) = 0;
        int x;      //dient nur zu Testzwecken
    
    };
    
    class wrFirstNode : wrAbstractNode {
    
        private:
    
        public:
    
        wrFirstNode();
        ~wrFirstNode();
        void add(int x);
    
    };
    
    //Und hier der Code wo der Fehler auftritt
    wrLinkedList::wrLinkedList() {
    
    pHead_node = new wrFirstNode;      //hier
    
    }
    

    Die Fehlermeldung:

    In function `_ZN12wrLinkedListC2Ev':
    undefined reference to `wrFirstNode::wrFirstNode()'
    In function `_ZN12wrLinkedListC1Ev':
    undefined reference to `wrFirstNode::wrFirstNode()'
    


  • Du hast nur die Deklaration gepostet. Wo ist die Definition des Konstruktors?



  • Oh sry, ich verwende den Standardkonstruktor, dachte den muss man nicht definieren.

    Wenn ich das hinzufüge

    wrFirstNode::wrFirstNode() {
    
    }
    

    kommt diese Fehlermeldung:

    undefined reference to `wrAbstractNode::wrAbstractNode()'
    

    Wenn ich dann noch

    wrAbstractNode::wrAbstractNode(){
    }
    

    hinzufüge, kommt dieser Fehler:

    undefined reference to `vtable for wrFirstNode'|
    

    Leider ist Vererbung + virtual noch etwas neu für mich, vielleicht könnte mir jemand erklären was dem Compiler fehlt ??

    Danke



  • Was ich noch fragen wollte, aber vergessen habe im letzten post:

    Wenn man wie ich nur den Standardkonstruktor verwenden will, muss man den auch definieren ???? Ich dachte man muss diesen nur deklarieren?!



  • Sry, hab den Fehler dank deinem Tipp schon gefunden !!

    Ich hatte bei allen destruktoren und konstruktoren, welche den Standard de/konstruktor verwenden sollen die {} vergessen.

    Hab jetzt alles nachgetragen und jetzt läuft es.

    Aber eine Frage habe ich noch, bitte

    Warum muss man bei

    class wrFirstNode : public wrAbstractNode
    

    den Modifier public verwenden ?!? Was macht es für einen unterschied wenn cih ihn weg lasse, oder private verwende ???



  • Gast2235235 schrieb:

    Wenn man wie ich nur den Standardkonstruktor verwenden will, muss man den auch definieren ???? Ich dachte man muss diesen nur deklarieren?!

    Was Du deklariert hast, musst Du auch definieren. Für den Standardkonstruktor, -kopierkonstruktor, -destruktor und -zuweisungsoperator musst Du auch die Deklaration weglassen. Ansonsten sagst Du dem Compiler damit, dass er Dir die Standard-Versionen eben gerade nicht erzeugen soll, sondern dass Du sie ggf. selbst definierst.

    Zum anderen Code: definier auch die Destruktoren, dann sollte es gehen.



  • Gast2538258 schrieb:

    Warum muss man bei

    class wrFirstNode : public wrAbstractNode
    

    den Modifier public verwenden ?!? Was macht es für einen unterschied wenn cih ihn weg lasse, oder private verwende ???

    'private'-Vererbung ist eigentlich gar keine im Sinn der OOP. Zumindest nach außen hin (also außerhalb der Klasse) sind die Typen nicht kompatibel, d.h. die vererbte Klasse ist *keine* Unterklasse der Basisklasse. Das bedeutet z.B., dass folgende Zuweisung nicht funktioniert:

    class Base { };
    
    class Derived : Base { };
    
    Base* b = new Derived();
    

    Wenn Du das das 'public' weglässt, hat es bei Klassen denselben Effekt, als würde da 'private' stehen. Bei structs hat es denselben Effekt, als würde da 'public' stehen.



  • danke !! 🙂

    Da lag mein Denkfehler, dachte man muss sie deklarieren, aber wenn keine def. vorhanden ist wird der standard ctor verwendet

    Wenn mir jetzt noch wer sagen könnte warum der modifier public notwendig ist beim vererben wäre ich wunschlos ^^



  • Danke ! 👍 Sehr nett, werd ich mir gleich hinter die Ohren schreiben 🙂


Anmelden zum Antworten