Klassen mit include einbinden?

Füge doch vor der Deklaration von 'class Univers' eine Vorausdeklaration von Skybox ein. Also einfach
Code:
class Skybox;
 
   class Univers{
  
  private: 
  	Skybox _aSkyBox;
  	double _sizeX;
 ...
Dann solte der Compiler sich nicht mehr beschweren.
Allerdings stimme ich prinzipiell CodeFatal zu, daß zyklische Includes zu vermeiden sind.
 
@jokey2: Die Vorausdeklaration funktioniert allerdings nur, wenn mit Zeigern gearbeitet wird.
Dein Codebeispiel wird dem Compiler nicht gefallen ;)
 
Ups. da hast Du recht! Sorry! Der Compiler will ja dann gleich den Konstruktor aufrufen, wenn er die Klasse Univers anlegt. Daher sollte TrAgic einen Konstruktor für Skybox implementieren. Und am Besten auch gleich einen Destruktor.
 
Hi.

Mit Anlegen (= Instanzieren) hat das erstmal nix zu tun. Dem Compiler muß allerdings die Größe der Klasse bekannt sein und dazu muß er die Größe aller Mitglieder einer Klasse wissen. Die Größe ist bei einem Pointer natürlich bekannt, nach einer Vorausdeklaration einer Klasse leider nicht.

Wenn man keinen Konstruktur anlegt, generiert der Compiler einen Standard-Konstruktur (und einen Kopier-Konstruktor). Ich finde es unnötig leere Konstruktoren zu schreiben...
 
Ich danke euch allen! Dachte mir sowas schon, dass ich ein Fehler in den includes haben müsste. Konnte mir aber nicht erklären wo, und vor allem nicht wie. Denn durch das #ifndef wird doch die Doppeldefinition verhindert oder? Sprich ich müsste theoretisch ein und die selbe Header tausendfach includieren können, ohne Probleme. Kann mir eigentlich nur vorstellen, dass eine cyclische Einbindung zu einer Endlosschliefe führen könnte, aber das er dadurch die Typdefinition nicht rafft....


Aber danke! Werd ich nachher gleich mal ausprobieren. Hoffe ich kann dann endlich wieder an wichtigen Sachen weiterarbeiten :)
 
Stimmt, der #ifdef-Guard hat die Doppelinkludierung verhindert. Allerdings hat eben der Header, der die erste Header-Datei erneut inkludieren will dann eben den Typ nicht (weil er ja durch die Guards den Header ignoriert hat).

Ohne Guard hätte es einen Neudefinitionserror gegeben (oder Cyclic dependency error oder so).
 
Zurück