Konstruktor in CPP Datei auslagern bei Vererbung



  • Hi,
    Ich möchte einen Konstruktor auslagern, der den Konstruktor einer Unterklasse aufruft, aber irgendwie klappt das nicht.

    //Im header
    class MySubClass : public MyClass{
    public:   
       MySubClass(P1,P2,P3,P4);
     //usw..
    }
    
    //In der .cpp
    #include "MyClass"
    
    MySubClass::MySubClass(P1,P2,P3,P4):MyClass(P1,P2,P3) {
    P4 = super!;
    }
    

    Wenn ich das so mache, dann bekomme ich den Fehler "undifined reference to MyClass". Wenn ich den Konstruktor aus der .cpp in den header kopieren, dann geht das.
    Ist es nicht möglich den Konstruktor bei Vererbung auch auszulagern oder hab ich da einfach irgendwo einen Fehler?

    Danke!



  • Es sieht so aus, als ob im Header

    #include "MyClass"
    

    fehlt.



  • Hmm, meine angaben waren nicht ganz korrekt..
    Also in die Header Datei inkludiere ich nichts, in die CPP jedoch "MyClass" und "MySubClass" auch genau in dieser Reihenfolge



  • Aber in der Headerdatei für MySubClass ist MyClass nicht bekannt, wenn Du dort nicht den Header für MyClass einbindest.



  • Naja auch mit einbinden läufts nicht..
    Frag ich doch mal anders:
    Ich habe nun zwei Header Dateien und Zwei CPP Dateien. MyClass.h/.cpp und MySubClass.h/.cpp. MyClass vererbt an MySubclass.
    Was muss ich nun wo einbinden?



  • Du musst halt überlegen, welche Datei was benötigt.

    Kommen Basisklassen und Member vor, so müssen deren Typen vollständig definiert sein. Das heisst, deren Header mit der Klasse muss eingebunden werden.
    Arbeitest du dagegen mit Zeigern oder Referenzen als Member, so reicht eine Vorwärtsdeklaration.

    Die Implementationsdateien (.cpp) müssen ihren jeweils zugehörigen Header (.h) inkludieren, damit die Methoden der Klasse definiert werden können.
    Abgeleitete Klassen müssen den Header ihrer Basisklasse einbinden.


  • Administrator

    Am besten mal ein Code Beispiel:

    // Base.hpp
    
    class Base
    {
    public:
      Base(int i);
    };
    
    // Base.cpp
    
    #include "Base.hpp"
    
    Base::Base(int i)
    {
    }
    
    // Derived.hpp
    
    #include "Base.hpp"
    
    class Derived : public Base
    {
    public:
      Derived(int i, int c);
    };
    
    // Derived.cpp
    
    #include "Derived.hpp"
    
    Derived::Derived(int i, int c)
      : Base(i)
    {
    }
    

    Jetzt verständlich?

    Grüssli



  • Pille456 schrieb:

    Ich habe nun zwei Header Dateien und Zwei CPP Dateien. MyClass.h/.cpp und MySubClass.h/.cpp. MyClass vererbt an MySubclass.
    Was muss ich nun wo einbinden?

    In MySubClass.h muß die Datei MyClass.h includiert werden.



  • Hmm komisch, genauso hab ich das gemacht!
    Hier mal der Original Code:

    //Vector.h
    class Vector {
    public:
        Vector(double pXKoord, double pYKoord, double pZKoord);
        //usw..
    };
    
    //Vector.cpp
    #include "Vektor.h"
    
    Vector::Vector(double pXKoord, double pYKoord, double pZKoord) {
    //machwas();
    }
    //usw...
    
    //GraphicObject.h
    #include "../Vector/Vector.h"
    
    class GraphicObject: public Vector  {
    public:
            GraphicObject(double pXKoord, double pYKoord, double pZKoord, double pSpeed);
    //usw...
    };
    
    //GraphicObject.cpp
    #include "GraphicObject.h"     
    
    GraphicObject::GraphicObject(double pXKoord, double pYKoord, double pZKoord, double pSpeed)
                               :Vector(pXKoord, pYKoord, pZKoord) {
    //machwas();
    }
    


  • Wenn Du nun noch beim Linken alle beteiligten Dateien angibst, und es dann nicht funktioniert, weiß ich auch nicht weiter.
    Der Code sieht gut aus.



  • So ...
    ich habe mir mal die vier Dateien angelegt, und Deinen Code jeweils da hineinkopiert.
    Zunächst konnte ich die Datei vector.cpp nicht kompilieren, da in der include-Instruktion nicht vector.h, sondern vektor.h steht ... hat gedauert, bis ich das festgestellt habe.
    Nachdem ich das berichtigt habe, konnte ich die beiden Dateien kompilieren und auch mit einem Hauptprogramm, in dem einfach nur ein Objekt der Klasse GraphicObject erzeugt wird, linken --->

    cl prog.cpp vector.cpp graphicobject.cpp

    ergibt prog.exe
    alles wunderbar ...

    #include "graphicobject.h"
    
    int main(void)
    {
    	GraphicObject go(5, 3, 4, 8);
    }
    


  • Hmm, ja komischer wirwarr.. Naja ich hab alle Dateien nochmal komplett neu organisiert und ein neues Projekt erstellt und siehe da es geht. Danke!



  • Du hast Schreibfehler drin.
    Die Datei heisst Vector.h, du inkludierst aber Vektor.h
    Blödes Englisch, gell?



  • Ich würde die Datei aber nicht fast gleich nennen wie den Standardheader <vector>...


Anmelden zum Antworten