Vorwärtsdeklaration mit Vererbungsangabe
-
Hallo @all,
ich habe folgendes Beispiel und würde gerne wissen, ob ich das durch
Vorwärtsdeklaration lösen kann. Mir ist klar, dass ich den entsprechenden
Header einfach inkludieren kann, aber Vorwärtsdeklaration rulez
icrate.h:
class Bottle; class ICrate { public: virtual Bottle& operator[](unsigned int i) = 0; }crate.h
#include "icrate.h" template <class BottleType> class Crate : public ICrate { public: virtual Bottle& operator[](unsigned int i){return *bottles[i]}; BottleType& getBottle(unsigned int i){return *bottles[i]}; private: std::vector<BottleType*> bottles; } #include "bottle.h" // hier muss ja includiert werden, da Bottle eine Basisklasse ist class BeerBottle : public Bottle; // muss ich hier auch inkludieren? So klappt es jedenfalls nicht :( typedef Crate<BeerBottle> BeerCrate;Ich hoffe es ist klar geworden, was ich meine. Es geht halt um die Vorwärts-
deklaration von BeerBottle.Gruß,
CSpille
-
Also ich glaube dass BeerBottle ein unvollständiger Typ ist wenn Bottle nicht vollständig definiert ist, da es ja die Basis ist...
-
Hallo Pigeon,
ich habe die Klasse Bottle jetzt zwar nicht angegeben, aber durch den
#include vor BeerBottle wird die Klasse vollständig definiert. Vielen
Dank dennoch für die Vermutung.Gruß,
CSpille
-
Ich versteh nicht, wo du die Forward Declaration haben willst. Du inlucest bottle.h ja.
-
Hallo drakon,
in Zeile 16. So wie sie da steht funktioniert sie leider nicht.
Es geht also um BeerBottle nicht um Bottle. BeerBottle ist nicht in bottle.h
definiert.Gruß,
CSpille
-
CSpille schrieb:
Hallo drakon,
in Zeile 16. So wie sie da steht funktioniert sie leider nicht.
Es geht also um BeerBottle nicht um Bottle. BeerBottle ist nicht in bottle.h
definiert.Gruß,
CSpilleAso.
Ne. Das geht nicht. Du hast BeerBottle ja noch nicht definiert.Entweder
class BeerBottle : public Bottle; typedef Crate<BeerBottle*> BeerCrate;oder
class BeerBottle : public Bottle{} typedef Crate<BeerBottle> BeerCrate;
-
Hey CSpille! Und wenn ich in der Kiste neben den ganzen Bierflaschen einen teuren Wein verstecken will damit ihn keiner findet?

-
Hey drakon,
vielen Dank!!! Bisher klappt das mit der leeren Definition der Klasse gut.
Allerdings befürchte ich, dass ich damit irgendwann in einer .cpp-Datei
Probleme kriege, wenn ich BeerBottle-spezifische Funktionen aufrufe.
Dann muss ich in der .cpp ja auch die beerbottle.h includieren und
werde eine redefinition of class erhalten. Dann muss ich wohl doch includieren
(oder Zeiger nehmen).@Alcoholic: "Normale" Weinflaschen sind größer als Bierflaschen

Gruß,
CSpille
-
Also das Beispiel war nicht dazu gedacht, dass du eine leere Definition hast. Das ist eine Definition und da sollte alles reinkommen, was hald reingehört. Es wäre so schlichtweg einfach nicht möglich eine forward declaration zu machen, wenn du du Informationen zum ganen Objekt brauchst.
Allerdings solltest du nicht zwanghaft veruschen nur forward declaration zu haben. Meistens ist es ohne Probleme möglich normal zu inluden.