Kreuzeinbinden - forward deklaration
-
Hallo,
folgende ausgangsbedingung:
ich habe zwei klassen "CGrammar" und "CAutomaton" die jeweils in einer header-datei deklariert und definiert werden. CGrammar und CAutomaton besitzen jeweils eine methode Export. diese benutzt jeweils eine instanz der jeweils anderen klasse. also in CGrammar::Export wird eine instanz von CAutomaton erzeugt und anders rum.mein problem:
wenn ich nun die header datei von CGrammar in der von CAutomaton einbinde und anders herum dann sagt mir der compiler das er das objekt CAutomaton nicht kennt.
ich weis das es mal irgendwas gab mit forward damit der compiler weis welche klasse er zuerst initialisieren soll. wär net wenn ihr mir kurz sagen könntet ob das noch möglich ist und wenn wie!danke schon mal !
-
Fwddeklaration geht so:
class KlassenName;
Beispiel:
class CAutomaton;
Um die verwenden zu können brauchst Du dann aber einen Zeiger bzw. eine Referenz.
Hintergrund: Der Compiler möchte wissen wie groß der Datentyp ist. Für ein Zeiger und einer Referenz ist der immer gleich groß. Da gibt er sich mit dem Versprechen zu frieden das irgendwo ne deklaration auftaucht. Ists kein Zeiger muss er den Aufbau der Klasse kennen.
-
hmm so ganz will das noch net.
wenn ich ein neues objekt:pExpGrammar = new CGrammar;
anlege, bekomme ich folgende fehlermeldung
[C++ Fehler] cautomaton.h(222): E2450 Undefinierte Struktur 'CGrammar'.
danke schon mal!
-
Hallo,
// Grammar.h #ifndef GRAMMAR_H__INCLUDED #define GRAMMAR_H__INCLUDED class Automaton; class Grammar { public: Automaton* Export() const; }; #endif // Automaton.h #ifndef AUTOMATON_H__INCLUDED #define AUTOMATON_H__INCLUDED class Grammar; class Automaton { public: Grammar* Export() const; }; #endif // grammar.cpp #include grammar.h #include automaton.h Automaton* Grammar::Export() const { return new Automaton(); } // automaton.cpp #include automaton.h #include grammar.h Grammar* Automaton::Export() const { return new Grammar(); }
Fertig.
Die zyklische Abhängigkeit ist aus Design-sicht aber nicht gerade schön.
-
AUTOMATON_H__INCLUDED
ist doch reserviert wegen __.
-
aber doch nicht in der "Wort"mitte
-
___ schrieb:
aber doch nicht in der "Wort"mitte
Doch auch dort. Dieser Fehler passiert mir jetzt zum 297 Mal. Mal sehen nach wie vielen Wiederholungen endlich ein Lerneffekt einsetzt.