C++ Headder Frage
-
Hallo ich hätte mal eine Frage,
ich habe wei Klassen KlasseA und KlasseBim Headder der KlasseB steht
#ifndef KlasseB_H
#define KlasseB_H
class KlasseA;heist class KlasseA = Das die Funktionen von KlasseA auch in B zur Verfügung stehen?
als ob man anstelle von class KlasseA;
#include <KlasseA> hätte schreiben können?Vielen Dank für die Erklärung im Vorraus
-
Arthur21 schrieb:
im Headder der KlasseB steht
#ifndef KlasseB_H
#define KlasseB_H
class KlasseA;heist class KlasseA = Das die Funktionen von KlasseA auch in B zur Verfügung stehen?
Das ist eine so genannte forward-Deklaration. Das sagt dem Compiler, dass es eine KlasseA gibt. Näher kennen tut er sie zu dem Zeitpunkt aber noch nicht.
als ob man anstelle von class KlasseA;
#include <KlasseA> hätte schreiben können?Wenn man kann, dann hätte man dies schreiben sollen. Allerdings gibt's gelegentlich so Situationen, dass man zwei Klassen hat und die sich gegenseitig "brauchen" und dann kommt man um eine forward-Deklaration nicht herum. Weil include setzt ja ein und diese zirkuläre Abhängigkeit ist etwas ungeschickt^^
MfG
GPC
-
Hallo
Also hat mann mit class KlasseA;
in KlasseB alle Funktionen der KlasseA zur Verfügung ?Mich wurdert dann nur das ich ohne die Include Anweisung
keine Objekte der KlasseA in B anlegen kann.Fehlermeldung: : error C2512: 'KlasseA': Kein geeigneter Standardkonstruktor verfügbar
mit include Anweisung in KlasseB
include "KlasseA" funktioniert es aber ?!
-
Die KlasseB muß in KlasseA als friend definiert werden, damit du alle Eigenschaften der KlasseA in KlasseB nutzen kannst. Damit erhältst du Lese und Schreibzugriff.
BSP:
class KlasseA : Objekt; { public: ...; private: ...; protected: ...; friend KlasseB; }Ist hoffentlich richtig...bin selbst nur Newbie

-
Ich denk die Frage war anders gemeint.
Nur mit der Forward deklaration weiss KlasseB ja noch nicht was sie mti KlasseA anfangen soll (ist ja kein Klassenrumpf da) Sie weiss nur dass es sie irgendwo gibt.
Wie das ueblicherweuise geloest wird weiss ich net, ICH (als Anfaenegr) haette, da dann jetzt KlasseB.h in KlasseA.h inkludiert und dann ueberall wo ich die beiden Klassen brauche entweder beide Header oder nur KlasseA.h inkludiert. Inwieweit das korrekt ist weiss ich nicht, wartest besser noch auf eine professionellere ANtwort.
EDIT: irgendwie muesste es ja auch gehen wenn man dann in KlasseB.h HINTER die Definition von KlasseB KlasseA.h inkludiert. Denke aber nicht, dass das so ueblich ist.
-
Wenn du nur die Abhängigkeit in einer Richtung hast, ist das
#include "KlasseA.h"schon der richtige Ansatz. Aber bei gegenseitigen Abhängigkeiten klappt das nicht mehr (#include ist eine simple Textersetzung, also würde dieser gegenseitige Include entweder zu einer Endlos-Rekursion oder zu massig "unknown identifier" Fehlern führen), deshalb die Forward-Deklaration.Mit dieser Forward-Deklaration weiß der Compiler, daß es die Klasse 'KlasseA' gibt - das heißt, du kannst sie nutzen, solange du nichts über ihre Größe und Struktur wissen mußt (z.B. kannst du an dieser Stelle Zeiger und Referenzen darauf anlegen, aber keine Variablen von dem Typ - dazu benötigst du die komplette Definition). Deshalb mußt du üblicherweise weiter unten im Programm (z.B. in der 'KlasseB.cpp') doch noch den Header einbinden, bevor du die Methoden der Klasse nutzen kannst.