Header-Einbindung

Kangaxx

Mitglied
Hallo zusammen,

hab mal ne kleine Frage:
Ich hab 2 Header Files(Player.h und Game.h) die jeweils eine Klasse enthalten. Die Methoden der beiden Klassen werden in der jeweiligen Cpp-File (Player.cpp und Game.cpp) implementiert.

Mein Problem ist folgendes:
Die Klasse CGame soll ein Element CPlayer enthalten, und die Klasse CPlayer wiederrum ein Element CGame.

Bei Delphi ist dies kein Problem da man lediglich die benötigte Unit per "uses" einbinden muss.

Bei C++ bin ich aber nicht sicher wie ich die Headerfiles einzubinden habe, damit beide Klassen in beiden Headerfiles bekannt sind.

mfg
Kangaxx
 
Beide direkt mit .h einzubinden geht nicht, das gibt circular inclusion bzw. der Präprozessor verheddert sich.

Du musst aber zwangsläufig ja auch mindestens eines der Elemente als Pointer eingesetzt haben (Es kann ja nicht ein CGame einen CPlayer enthalten und ein CPlayer wiederum ein CGame). Deshalb müsstest du bei der Klasse, die den Pointer als Member hat mit einer Forward-Deklaration auskommen können:

Player.h
Code:
class CGame;

class CPlayer
{
  // schnippel-schnappel

  CGame*        m_pGame;
}
In dem Fall wie oben musst du nicht Game.h includen. Wenn das andersrum auch bei Game.h so funktioniert, umso besser. Je weniger Header du direkt included musst, desto seltener läufst du auf dieses Problem.
 
Noch ein Tipp, um Mehrfacheinbindung von Headerdateien zu verhindern:
(keine Lösung zu deinem Problem)

Code:
#ifndef _NAMEDERDATEI_H
#define _NAMEDERDATEI_H

// ... Code deiner Headerdatei...


#endif // (_NAMEDERDATEI_H)

Dies bewirkt, wenn deine Headerdatei mit #include eingebunden wird, dass der Präprozessor kontrolliert, ob _NAMEDERDATEI_H definiert ist. Wenn es schon definiert ist springt er zum ende ders #ifndef (#endif). Ansonsten definiert er _NAMEDERDATEI_H und bindet den Rest des Codes ein.
Falls die Datei fälschlicherweise ein zweites mal eingefügt wird, ist ja _NAMEDERDATEI_H schon definiert und der Präprozessor springt wieder ans Ende.

Ich hoffe meine Erklärung ist einigermassen klar.

Bei neueren MS Compilern gibt es einen Präprozessor Befehl, der das gleiche bewirkt. Weiss aber nicht wie der heisst...

Gruss LukeS
 
Zurück