Forum: PC-Programmierung Visual C++ Includingproblem


von Marcel (Gast)


Lesenswert?

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?

von Peter (Gast)


Lesenswert?

zeig doch mal etwas vom dem code. Der MS compiler macht bei den Includes 
auch nichts anderes als der GCC.

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.