OVH Cloud OVH Cloud

Reference croisée, question de NEWBIE!

6 réponses
Avatar
Gabriel Landais
Salut,
j'ai deux .h ainsi fait:
--- Chien.h ---
class Chien;
#include "Homme.h"
class Chien : public TObject
{
public :
Homme *tintin;
};
--- Homme.h ---
class Homme;
#include "Chien.h"
class Homme : public TObject
{
public :
Chien *milou;
};
----------------

Je trouve ca assez hideux comme solution, yaurait pas mieux?
Merci!
Gabriel

6 réponses

Avatar
Le Géant Vert
Gabriel Landais wrote:

Salut,
j'ai deux .h ainsi fait:
--- Chien.h ---
class Chien;
#include "Homme.h"
class Chien : public TObject
{
public :
Homme *tintin;
};
--- Homme.h ---
class Homme;
#include "Chien.h"
class Homme : public TObject
{
public :
Chien *milou;
};
----------------

Je trouve ca assez hideux comme solution, yaurait pas mieux?
Merci!
Gabriel


absolument pas, c'est LA bonne solution :)

Avatar
Rémy
"Le Géant Vert" a écrit dans le message de
news:c2a19g$gic$
Gabriel Landais wrote:

Salut,
j'ai deux .h ainsi fait:
--- Chien.h ---
class Chien;
#include "Homme.h"
class Chien : public TObject
{
public :
Homme *tintin;
};
--- Homme.h ---
class Homme;
#include "Chien.h"
class Homme : public TObject
{
public :
Chien *milou;
};
----------------

Je trouve ca assez hideux comme solution, yaurait pas mieux?
Merci!
Gabriel


absolument pas, c'est LA bonne solution :)


Sauf qu'il faut protéger les includes contre les inclusions multiples (sinon
ça boucle)...


Avatar
Gabriel Landais
Avec
#ifndef HommeH
#define HommeH
...
#endif?

Merci :)


Sauf qu'il faut protéger les includes contre les inclusions multiples (sinon
ça boucle)...


Avatar
Rémy
"Gabriel Landais" a écrit dans le
message de news:c2a1n4$mjg$
Avec
#ifndef HommeH
#define HommeH
...
#endif?

Merci :)



Tout à fait.

L'autre solution est:

--- Chien.h ---
class Homme;
class Chien : public TObject
{
public :
Homme *tintin;
};

--- Homme.h ---
class Chien;
class Homme : public TObject
{
public :
Chien *milou;
};
----------------

On n'a pas besoin d'inclure la définition complète de Homme dans Chien.h
puisqu'on n'utilise qu'un pointeur. Il suffit de savoir que c'est une
classe. (et réciproquement).



Ce qui n'empêche pas de protéger les includes (on ne sait jamais par quel
chemin ils finiront par être appelés).

Rémy

Avatar
Gabriel Landais
Merci ca devient plus clair maintennant :)
Une dernière question, j'utilise GDI+ un peu partout dans mes fichiers,
je comprend pas vraiment comment l'inclure qu'une seule fois pour tout
le projet, parce que la il me l'include au moins 5 fois! :)
Merci!
Gabriel


"Gabriel Landais" a écrit dans le
message de news:c2a1n4$mjg$

Avec
#ifndef HommeH
#define HommeH
...
#endif?

Merci :)




Tout à fait.

L'autre solution est:

--- Chien.h ---
class Homme;
class Chien : public TObject
{
public :
Homme *tintin;
};

--- Homme.h ---
class Chien;
class Homme : public TObject
{
public :
Chien *milou;
};
----------------

On n'a pas besoin d'inclure la définition complète de Homme dans Chien.h
puisqu'on n'utilise qu'un pointeur. Il suffit de savoir que c'est une
classe. (et réciproquement).



Ce qui n'empêche pas de protéger les includes (on ne sait jamais par quel
chemin ils finiront par être appelés).

Rémy





Avatar
Michel Michaud
Dans news:c2a19g$gic$, Le Géant
Gabriel Landais wrote:

Salut,
j'ai deux .h ainsi fait:
--- Chien.h ---
class Chien;
#include "Homme.h"
class Chien : public TObject
{
public :
Homme *tintin;
};
--- Homme.h ---
class Homme;
#include "Chien.h"
class Homme : public TObject
{
public :
Chien *milou;
};
----------------

Je trouve ca assez hideux comme solution, yaurait pas mieux?
Merci!
Gabriel


absolument pas, c'est LA bonne solution :)


Non, la bonne solution est de rendre les fichiers d'en-tête
assez complets en eux-mêmes, donc la déclaration des classes
devraient y être placées. Donc class Chien; devrait être
dans Homme.h et class Homme; dans Chien.h et alors il n'est
probablement pas nécessaire d'inclure les fichiers d'en-tête
de l'autre type. (Bien sûr, il faut aussi la protection contre
les inclusions multiples, mais c'est tout autre problème).

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/