Hi, ich programmiere gerade in MS Visual Studio 2008 an einem Projekt. Ich möchte dabei zwei Klassen schreiben, die voneinander abhängen/sich gegeneinander benötigen. Klasse A sind die eigentlichen Daten. Klasse A hat Funktionen die Klasse B als Argument bekommen. Klasse B verwaltet einen Vektor der Klasse A. Wie includiere ich das nun? Im gcc bin ich gewöhnt, das einfach durch eine Vorwärtsdeklaration zu machen. Das klappt auch zwar auch, jedoch nicht in jeder Datei. Jenachdem ob ich das ich nun in weiteren Dateien diese beiden Dateien includiere, haut er beim compilieren Fehlermeldungen raus, das er Klasse A nichtmehr kennt oder lässt es auch bleiben. Willkür will ich dem Compiler nicht unterstellen, einen logischen Sinn sehe ich aber nicht. Kann mir wer da weiterhelfen?
zeig doch mal etwas vom dem code. Der MS compiler macht bei den Includes auch nichts anderes als der GCC.
Marcel schrieb: > Klasse A sind die eigentlichen Daten. Klasse A hat Funktionen die Klasse > B als Argument bekommen. Dafür reicht erst mal eine Vorwärtsdeklaration vor A > Klasse B verwaltet einen Vektor der Klasse A. Dazu benötigst du Klasse A > Wie includiere ich das nun? In Header File für A machst du eine Vorwartsdeklaration für B rein. Du kannst dann keine inline-Funktionen machen, die B benutzen würden. Wann immer du B tatsächlich benutzen willst, ist eine Vorwärtsdeklaration zu wenig. Im Header File für B includierst du den Header für A. Dort kannst du dann auch inline Funktionen benutzen, die irgendetwas von A benutzen. > Im gcc bin ich gewöhnt, das einfach durch > eine Vorwärtsdeklaration zu machen. Das klappt auch zwar auch, jedoch > nicht in jeder Datei. Ist eigentlich ganz einfach. Sieh dir die entsprechenden Stellen an. Wenn es an dieser Stelle genügt, dass der Compiler weiß "Aha, diese Klasse gibt es tatsächlich. Das ist nicht einfach nur ein Tippfehler", dann genügt eine Vorwärtsdeklaration. Um zb einen Pointer oder eine Referenz zu definieren, reicht diese Information aus. Bestimmend für den Speicherverbrauch ist dann ja nicht die Klasse A an sich, sondern der Speicher, den der Compiler benötigt um einen Pointer oder eine Referenz zu implementieren. Und diesen Speicherverbrauch kennt der COmpiler natürlich. Er weiß wieviele Bytes er für einen Pointer benötigt (egal wo der hin zeigt). Sobald der Compiler aber Informationen über den Internen Aufbaui, wie zb Aufruf einer Funktion der Klasse, benötigt, reicht eine Vorwärtsdeklaration nicht mehr. Da muss dann schon die komplette Klassendeklaration zur Verfügung stehen. Auch wenn du in Klasse B einen Member von A machen willst, muss der Compiler den Aufbau von A kennen. Er muss ja schliesslich wissen, wieviel Speicherplatz er dafür reservieren muss.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.