mikrocontroller.net

Forum: PC-Programmierung Visual C++ Includingproblem


Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.