Vorwärtsdeklaration bei Vererbung



  • Hallo,
    ich arbeite mit C++ noch nicht so lange. Am Anfang wurde mir aber gesagt, man soll #includes mit relativen Pfaden am besten nicht in der Header-Datei machen, um später keine Linker-Probleme zu bekommen wenn die Klasse von irgend wo anders eingebunden wird. Besser ist es, wenn man ein Vorwärts-Deklaration macht (in Header nur

    class includeKlasse;
    

    angeben) und anschließend in der cpp den richtigen include.

    Das versuche ich auch stets zu beachten. Nun habe ich aber eine Klasse von der ich ableiten will.
    also:

    class Klassenmane : public abgeleiteteKlasse
    {
    ...
    }
    

    Damit dies geht muss ich die "abgeleiteteKlasse" vorher includieren. Sie liegt auch in einem ganz anderen Ordner.
    Eine Vorwärts-Deklaration funktioniert hier nicht, da sonst der Fehler C2504 kommt: Basisklasse undefiniert.

    Wie mache ich es hier, damit es für die Zukunft sicher ist, wenn wer meine Klasse von wo anders nutzen will?

    Danke



  • Zur Vererbung muss die Klasse komplett bekannt sein, weil die Klassendefinition ja sonst unvollständig wäre (was da reinkommt, ist ja dann nicht bekannt!). D.h. Du musst inkludieren. Daran sieht man auch, dass Vererbung stärker bindet als Komposition und man im Zweifelsfall daher eher Letzteres verwenden sollte.



  • Hallo Xenya,

    in diesem Fall benötigst du den include im Header.

    Ich vermute du möchtest etwas haben wie include guards, damit du kein
    Problem mit Doppeldeklarationene hast.

    Etwa so:

    #ifndef MY_NAMESPACE_MY_CLASS_H
    #define MY_NAMESPACE_MY_CLASS_H
    class MyBaseClass{
    // ...
    };
    
    #endif
    

    Probleme kriegst du nur, wenn du die Klasse (wenn sie kein Template ist) im Header implementierst.

    Gruß,
    XSpille


  • Mod

    Du musst auf jeden Fall das Include reinmachen. die Warnung die du wegen der Pfade bekommen hast, halte ich für übertrieben paranoid. Du wirst doch wohl wissen, in welchen Pfaden deine Dateien liegen.

    Falls du die Header projektintern benutzt, dann schreibst du
    #include "relativer/pfad/vom/hauptverzeichnis/deines/projekts/foo.h"

    Falls du eine Bibliothek schreiben möchtest, dann schreibst du
    #include <relativer/pfad/vom/includeverzeichnis/foo.h>



  • vielen lieben Dank für die Antworten.

    da es eine Bibliothek wird werde ich es mit <> machen


Anmelden zum Antworten