Fehlermeldung, Ableiten, verschiedene Headerfiles



  • Hallo,

    ich habe in einem Headerfile "BD.h" die Klassen B und D definiert

    class B { };
    class D : public B { };
    

    und in einem anderen Headerfile "C.h" die Klasse C

    #include "BD.h"
    
    class B;
    class D;
    
    class C 
    {
    	B* f() { D* d; return d; }
    };
    

    Wenn ich das versuche zu kompilieren erhalte ich, die Fehlermeldung

    cannot convert ‘D*’ to ‘B*’ in return

    bezüglich der Zeile

    B* f() { D* d; return d; }
    

    Wenn ich alles in ein Headerfile packe

    class B { };
    class D : public B { };
    
    class C 
    {
    	B* f() { D* d; return d; }
    };
    

    erhalte ich keine Fehlermeldung.

    Weiss irgendjemand, was hier passiert?

    Es sei darauf hingewiesen, dass dieser Code Teil eines größeren Projektes ist (allerdings wäre mir schleierhaft, wie der Rest des Codes Einfluss auf den Fehler haben sollte)



  • hast du den include wirklich vorher schon drin oder nur die Forward-Deklaration?
    nimm die Forward-decl mal raus, die ist unnötig weil du B und D durch den eingebundenen Header schon bekannt machst.
    Falls dann ne andere Fehlermeldung kommt von wegen B oder D nicht bekannt, dann bindest du den falschen header ein... Keine Ahnung wie sicher du dir bist ob das auch WIRKLICH der richtige Header mit den beiden klassendefinitionen ist den du da einbindest...



  • ingobulla schrieb:

    und in einem anderen Headerfile "C.h" die Klasse C

    #include "BD.h"
    
    class B;
    class D;
    
    class C 
    {
    	B* f() { D* d; return d; }
    };
    

    Wie wäre es mit einer sauberen Header/Source-Trennung? Vorwarddeklarationen bitte auch nur verwenden, wenn du die Klassen nicht inkludierst.

    Zudem gibst du eine uninitialisierte Variable zurück

    Besser:

    // C.h
    #ifndef C_HEADER
    #define C_HEADER
    
    class B;
    
    class C 
    {
        public:
            B* f();
    };
    
    #endif
    
    // C.cpp
    #include "BC.h"
    
    B* C::f()
    {
        D* d = new D();
        return d;
    }
    

    Ich bin kein Fan von getrennten new/delete aber ich habe dein Beispiel einfach mal übernommen und mit einem initialisierten d gearbeitet.

    ingobulla schrieb:

    Weiss irgendjemand, was hier passiert?

    Ja, die Vorwarddeklarationen enthalten keine informationen zur Vererbungshirachie, daher könnten sie hier ein Problem darstellen. Ganz von der fehlenden Header/Source Trennung mal abgesehen.

    cu André


Anmelden zum Antworten