OVH Cloud OVH Cloud

probleme avec des hearders

12 réponses
Avatar
Xavier Seneque
Bonjour,

j'ai 3 classes : A, B et C

dans la définition de la classe A, il y a un objet B.
dans la definition de la classe B, il y a un objet C.
dans la definition de la classe C, il y a un objet B.

voila en gros :
A.h
#include "B.h"
class A
{
public:
B b;
};

B.h
#include "C.h"
class B
{
public:
C c;
};

C.h
#include "B.h"
class C
{
public:
B b;
};

j'ai tout encadré avec des #ifndef et #define pour pas que ce soit
recursif...

mais bon, comment faire pour que lorsque l'on arrive à l'analyse du
fichier C.h ( en passant par A.h puis B.h ), la classe B soit définie ?

Merci d'avance !

10 réponses

1 2
Avatar
Matthieu Moy
Xavier Seneque writes:

j'ai tout encadré avec des #ifndef et #define pour pas que ce soit
recursif...


Ca limite la casse, mais il faut quand même résoudre le problème quand
il y a un cycle !

Solution : Utiliser des déclaration de classes partielles :

Class A;
typedef A* ptrA;

(Que tu peux placer au dessus de la protection par #ifdef de A.h, ou
en haut du fichier où tu l'utilises, ou bien dans un fichier à part,
du style A-partial.h)

Ensuite, bien sur, tu ne peux pas utiliser les méthodes ou attributs
de A, et tu ne peux pas faire grand chose avec A lui-même vu que le
compilateur ne connait pas sa taille, mais tu peux utilser ptrA sans
problème.

(De toutes façons, avec ton truc cyclique, il faut bien qu'il y ai un
pointeur quelque part, sinon, tu vas jouer aux poupées russes !!)

--
Matthieu

Avatar
Fabien LE LEZ
On Wed, 04 Feb 2004 17:15:21 +0100, Xavier Seneque
wrote:

B.h
#include "C.h"
class B
{
public:
C c;
};


Donc B est plus grand que C, puisque un B contient un C.

C.h
#include "B.h"
class C
{
public:
B b;
};


Donc C est plus grand que B, puisque un C contient un B.

N'y aurait-il pas une légère contradiction ?

--
;-)

Avatar
Régis Troadec
Salut,

"Xavier Seneque" a écrit dans le message de
news: bvr5r0$p6q$
Bonjour,

j'ai 3 classes : A, B et C

dans la définition de la classe A, il y a un objet B.
dans la definition de la classe B, il y a un objet C.
dans la definition de la classe C, il y a un objet B.

voila en gros :
A.h
#include "B.h"
class A
{
public:
B b;
};

B.h
#include "C.h"
class B
{
public:
C c;
};

C.h
#include "B.h"
class C
{
public:
B b;
};

j'ai tout encadré avec des #ifndef et #define pour pas que ce soit
recursif...

mais bon, comment faire pour que lorsque l'on arrive à l'analyse du
fichier C.h ( en passant par A.h puis B.h ), la classe B soit définie ?



Utilise des déclarations anticipées de classes (valable uniquement avec des
pointeurs, ce qui est logique) et descends tes en-têtes dans des fichiers de
définition (fais en si tu ne l'as pas fait).

// A.h

class B; // dans A.cpp, #include "B.h"

class A {
public:
A();
B * ptrB;
virtual ~A();
};

// B.h

class C; // dans B.cpp, #include "C.h"

class B
{
public:
B();
C * ptrC;
virtual ~B();
};

// C.h

class B; // dans C.cpp, #include "B.h"

class C
{
public:
C();
B * ptrB;
virtual ~C();
};

a+, Regis

Avatar
Horst Kraemer
On Wed, 04 Feb 2004 17:15:21 +0100, Xavier Seneque
wrote:

Bonjour,

j'ai 3 classes : A, B et C

dans la définition de la classe A, il y a un objet B.
dans la definition de la classe B, il y a un objet C.
dans la definition de la classe C, il y a un objet B.



C'est une construction impossible.

Pour calculer la taille de B le combilateur doit connaitre la taille
de C parce que B contient un C.

Pour calculer la taille de C le combilateur doit connaitre la taille
de B parce que C contient un B.

Pour calculer la taille de B le combilateur doit connaitre la taille
de C parce que B contient un C.

Pour calculer la taille de C le combilateur doit connaitre la taille
de B parce que C contient un B.

Pour calculer la taille de B le combilateur doit connaitre la taille
de C parce que B contient un C.

Pour calculer la taille de C le combilateur doit connaitre la taille
de B parce que C contient un B.


A suivre...

Au moins une des classe ne peut contenir qu'une réference à ou un
pointeur vers un objet de l'autre classe.


struct C; // déclaration incomplète pour pouvoir déclarer un C*

struct B
{
C* pc;
};

struct C
{
B b: // où B* pb;
};

La différence est qu'ici le compilateur connait la taille d'un C* qui
est indépendante de la taille future de C.

--
Horst

Avatar
Régis Troadec
"Horst Kraemer" a écrit dans le message de news:

On Wed, 04 Feb 2004 17:15:21 +0100, Xavier Seneque
wrote:

Bonjour,

j'ai 3 classes : A, B et C

dans la définition de la classe A, il y a un objet B.
dans la definition de la classe B, il y a un objet C.
dans la definition de la classe C, il y a un objet B.



C'est une construction impossible.


Chut !!! c'est la surprise !


Avatar
kanze
Fabien LE LEZ wrote in message
news:...
On Wed, 04 Feb 2004 17:15:21 +0100, Xavier Seneque
wrote:

B.h
#include "C.h"
class B
{
public:
C c;
};


Donc B est plus grand que C, puisque un B contient un C.

C.h
#include "B.h"
class C
{
public:
B b;
};


Donc C est plus grand que B, puisque un C contient un B.

N'y aurait-il pas une légère contradiction ?


Seulement si la taille des objets est finie. Si la taille de B et de C
est infinie, pas de problème.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16


Avatar
Fabien LE LEZ
On 5 Feb 2004 00:56:52 -0800, wrote:

Seulement si la taille des objets est finie. Si la taille de B et de C
est infinie, pas de problème.


Tiens oui, je n'y avais pas pensé. On devrait utiliser plus souvent
des objets de taille infinie, ça simplifie bien des problèmes...

--
;-)

Avatar
Alain Naigeon
"Fabien LE LEZ" a écrit dans le message news:

On 5 Feb 2004 00:56:52 -0800, wrote:

Seulement si la taille des objets est finie. Si la taille de B et de C
est infinie, pas de problème.


Tiens oui, je n'y avais pas pensé. On devrait utiliser plus souvent
des objets de taille infinie, ça simplifie bien des problèmes...


Ouah, et je te dis pas... le rapport qualité/prix !!

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France


Avatar
Jean-Marc Bourguet
Fabien LE LEZ writes:

On 5 Feb 2004 00:56:52 -0800, wrote:

Seulement si la taille des objets est finie. Si la taille de B et de C
est infinie, pas de problème.


Tiens oui, je n'y avais pas pensé. On devrait utiliser plus souvent
des objets de taille infinie, ça simplifie bien des problèmes...


Si les objets sont de tailles nulles, il n'y a pas non plus de
problemes.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
Fabien LE LEZ
On 06 Feb 2004 09:00:28 +0100, Jean-Marc Bourguet
wrote:

Si les objets sont de tailles nulles, il n'y a pas non plus de
problemes.


Ou plus généralement, si un objet contenant un autre objet a la taille
de l'objet contenu.

--
;-)

1 2