[C++] Include conflit...

Include conflit... [C++] - C++ - Programmation

Marsh Posté le 02-04-2006 à 23:18:59    

Bonjour à tous,
je suis confronté à un problème de conflit d'include dans la gestion de mes classes.
 
J'ai deux classes : NSWindow et NSControl
 
Le programme se présente de cette manière ci :
 

Code :
  1. class NSWindow;
  2. class NSControl
  3. {
  4.     NSControl(NSWindow *pWindow);
  5.     // etc, etc ...
  6. }
  7. class NSWindow : public std::vector<NSControl*>
  8. {
  9.     // etc, etc ...
  10. }


Maintenant j'aimerais bien placer ma classe NSControl dans un fichier NSControl.h et NSWindow dans un fichier NSWindow.h mais quand je fais cela j'ai plein d'erreurs à la compilation.
 
Voici l'exemple de ce que je veux faire :
 
NSControl.h :

Code :
  1. #pragma once
  2. #ifndef NSControl_H
  3. #define NSControl_H
  4. #include "NSWindow.h"
  5. class NSControl
  6. {
  7.     NSControl(NSWindow *pWindow);
  8.     // etc, etc ...
  9. }
  10. #endif


 
NSWindow.h :

Code :
  1. #pragma once
  2. #ifndef NSWindow_H
  3. #define NSWindow_H
  4. #include "NSControl.h"
  5. class NSWindow : public std::vector<NSControl*>
  6. {
  7.     // etc, etc ...
  8. }
  9. #endif


 
Le problème est que comme j'ai déjà inclu NSWindow.h dans le fichier NSControl.h, ca crée des conflits dans NSWindow.h puisque j'include le "NSControl.h" qui contient déjà le NHWindow.h.
Ca me fait des tonnes d'erreurs lorsque je compile ! :(
 
Y a t'il une solution pour éviter ce conflit ?
 
Un grand merci
 
 

Reply

Marsh Posté le 02-04-2006 à 23:18:59   

Reply

Marsh Posté le 03-04-2006 à 00:00:07    

ouais: faire des .cpp

Reply

Marsh Posté le 03-04-2006 à 00:09:33    

dans NSControl.H, fais une forward declaration sur NSWindows, et vire l'include nswindows.h
 
(tes #ifndef /  #define sont redondants avec #pragma once)

Reply

Marsh Posté le 03-04-2006 à 00:10:01    

cela dit je trouve ton design assez baroque

Reply

Marsh Posté le 03-04-2006 à 00:12:36    

chrisbk a écrit :

cela dit je trouve ton design assez baroque


 
càd à quel niveau ?
 
 
Donc j'ai juste fait un class NSWindow; en virant le "NSWindow.h" et ca marche.
 
Je suis assez étonné car dans ma tête j'avais vraiment besoin de faire l'include de NSWindow pour qu'il puisse identifier le "class NSWindow;" ?
 
Sinon j'ai viré #pragam once (habitude de mettre ca avec MFC).
 
Merci


Message édité par iS@mi le 03-04-2006 à 00:33:31
Reply

Marsh Posté le 03-04-2006 à 00:46:05    

bin non, class NSWindow sert a dire justement "y'a un truc qui s'apelle NSWindow, ca definit une classe. La def exacte, on verra plus tard si besoin", en gros

Reply

Marsh Posté le 03-04-2006 à 09:28:05    

chrisbk a écrit :

tes #ifndef /  #define sont redondants avec #pragma once


Tu peux développer ce point STP?
 
Ca fait quoi concrètement #pragma once ?

Reply

Marsh Posté le 03-04-2006 à 10:07:13    

bin ca assure betement qu'un fichier n'est inclu qu'une fois, donc faire pragma once et ensuite utiliser #ifndef/#define derriere pour faire grosso modo la meme chose n'a pas grand interet

Reply

Marsh Posté le 04-04-2006 à 00:29:25    

chrisbk a écrit :

bin ca assure betement qu'un fichier n'est inclu qu'une fois, donc faire pragma once et ensuite utiliser #ifndef/#define derriere pour faire grosso modo la meme chose n'a pas grand interet


 
Et qu'est ce qui est mieux à utiliser même si les deux font strictement la même chose ?

Reply

Marsh Posté le 04-04-2006 à 00:46:06    

les pragma dépendent des compilateurs, alors mieux vaut les éviter pour faire du code portable.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed