Header Reihenfolgen Problematik

Unique86

Mitglied
Hallo zusammen...

Ich habe drei Header Dateien, die ich selber einbinde ...

Code:
#include "IllegalArgumentException.h"
#include "Validator.h"
#include "UserInterface.h"

Ich habe in der Datei Validator.h einen Konstruktor, welcher ein UserInterface als Parameter erwartet.

Dann habe ich die Datei UserInterface.h. Diese Implementiert einen Konstruktor, welcher den Validator instantiiert und beim Instantiieren halt die Referenzübergabe macht (Stichwort "this").

Leider und Verständlich meckert meine IDE (DEV C++) das "UserInterface" am Validator nicht bekannt ist. Da die Header ja nach einer bestimmten Reihenfolge eingebunden werden. Wenn ich die Reihenfolge ändere, bringt mir das auch nichts, da dann das UserInterface" den Validator nicht kennt.

Kann mir vllt. zu der Problematik einen Tip geben ?

Gruß Sven
 
Stichwort Forward-Deklaration: Der Konstruktor von Validator benutzt vermutlich nur einen Pointer bzw. eine Referenz auf ein UserInterface?

In dem Fall nicht UserInterface.h includen, sondern einfach nur vor der Klassendeklaration von Validator ein class UserInterface; setzen.

Das sagt dem Compiler, es gibt eine Klasse namens UserInterface, wo und wie die Klasse aussieht, steht aber woanders. Das reicht dem Compiler, wenn es lediglich um einen Pointer bzw. Referenz geht.
 
Hi.

Diese Methode ist allerdings etwas unsauber. Du kannst ruhig Userinterface.h includen, aber mußt (was eigentlich immer gemacht werden sollte) nur den Code gegen Mehrfach-Einbindung schützen:

C++:
/* UserInterface.h */

#ifndef USERINTERFACE_H
#define USERINTERFACE_H

#include "Validator.h"

// Deklaration der Userinterface Klasse
class Userinterface {
...
};

#else // USERINTERFACE_H

class UserInterface; // forward Deklaration

#endif // USERINTERFACE_H
Das Gleiche solltest du wie gesagt auch in den anderen Header Dateien machen, wobei du den #else Zweig natürlich da weglassen kannst wenn du keine forward-Deklaration angeben willst.

Gruß

PS: Bitte markiere das Thema erledigt, falls deine Frage beantwortet ist.
 
Zurück