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é