OVH Cloud OVH Cloud

Types incomplets

7 réponses
Avatar
Frédéric Mayot
Bonjour,

Un petit souci avec mes includes et mes types incomplets.

struct conteneur
{
typedef std::vector<contenu*>::iterator iterator;
std::vector<contenu*> m_mon_contenu;
void une_fonction(){m_mon_contenu[1234]->ma_fonction();}
};

struct contenu
{
conteneur::iterator m_position;
void ma_fonction(){}
};

Je veux bien faire des types incomplets mais ça ne résoud pas le
problème (que vous voyez bien sûr) ...

Fred

7 réponses

Avatar
Falk Tannhäuser
Frédéric Mayot wrote:

Bonjour,

Un petit souci avec mes includes et mes types incomplets.

struct contenu;

struct conteneur
{
typedef std::vector<contenu*>::iterator iterator;
std::vector<contenu*> m_mon_contenu;
void une_fonction(){m_mon_contenu[1234]->ma_fonction();}
Remplacer par :

void une_fonction();
};

struct contenu
{
conteneur::iterator m_position;
void ma_fonction(){}
};


inline void conteneur::une_fonction(){m_mon_contenu[1234]->ma_fonction();}

Voilà voilà
Falk

Avatar
Frédéric Mayot
inline void conteneur::une_fonction(){m_mon_contenu[1234]->ma_fonction();}


Oui, bon d'accord... mais j'avais oublié de préciser que conteneur et
contenu étaient dans deux fichiers d'entête différents...

fichier conteneur.h ----
struct contenu;
struct conteneur
{
typedef std::vector<contenu*>::iterator iterator;
std::vector<contenu*> m_mon_contenu;
void une_fonction();
};
----

fichier contenu.h ----
struct contenu
{
conteneur::iterator m_position;
void ma_fonction(){}
};
----

Avatar
Falk Tannhäuser
Frédéric Mayot wrote:

inline void conteneur::une_fonction(){m_mon_contenu[1234]->ma_fonction();}


Oui, bon d'accord... mais j'avais oublié de préciser que conteneur et
contenu étaient dans deux fichiers d'entête différents...

fichier conteneur.h ----
struct contenu;
// Pas de #include "contenu.h" !

struct conteneur
{
typedef std::vector<contenu*>::iterator iterator;
std::vector<contenu*> m_mon_contenu;
void une_fonction();
};
----

fichier contenu.h ----
#include "conteneur.h"

struct contenu
{
conteneur::iterator m_position;
void ma_fonction(){}
};
----


Dans ce cas-là, mieux vaut renoncer à rendre conteneur::une_fonction
inline, et mettre son implémentation dans le fichier conteneur.cxx :
#include "conteneur.h"
#include "contenu.h"

void conteneur::une_fonction(){m_mon_contenu[1234]->ma_fonction();}

Ainsi, l'utilisateur de conteneur::une_fonction a juste besoin
d'inclure conteneur.h, mais pourra se passer de contenu.h .

Falk


Avatar
Manuel
"Falk Tannhäuser" a écrit dans le message de
news:
Frédéric Mayot wrote:

inline void
conteneur::une_fonction(){m_mon_contenu[1234]->ma_fonction();}




Oui, bon d'accord... mais j'avais oublié de préciser que conteneur et
contenu étaient dans deux fichiers d'entête différents...

fichier conteneur.h ----
struct contenu;
// Pas de #include "contenu.h" !

struct conteneur
{
typedef std::vector<contenu*>::iterator iterator;
std::vector<contenu*> m_mon_contenu;
void une_fonction();
};
----

fichier contenu.h ----
#include "conteneur.h"



Non! ce n'est ni nécéssaire, ni désirable
(pollution de l'espace de noms)
AMHA

struct contenu
{
conteneur::iterator m_position;
void ma_fonction(){}
};
----


Dans ce cas-là, mieux vaut renoncer à rendre conteneur::une_fonction
inline, et mettre son implémentation dans le fichier conteneur.cxx :
#include "conteneur.h"
#include "contenu.h"


C'est bien ici qu'il faut inclure le (ou les) fichier(s) d'entête.


void conteneur::une_fonction(){m_mon_contenu[1234]->ma_fonction();}

Ainsi, l'utilisateur de conteneur::une_fonction a juste besoin
d'inclure conteneur.h, mais pourra se passer de contenu.h .

Falk


--

- Manuel
to reply, swap the name with the domain.



Avatar
Falk Tannhäuser
Manuel wrote:

"Falk Tannhäuser" a écrit dans le message de
news:
Frédéric Mayot wrote:
[...]


fichier contenu.h ----
#include "conteneur.h"



Non! ce n'est ni nécéssaire, ni désirable
(pollution de l'espace de noms)
AMHA
Dans ce cas il me paraît difficile de faire référence à des membres de

'conteneur' dans 'contenu'.
struct contenu
{
conteneur::iterator m_position;
std::vector<contenu*>::iterator m_position;



void ma_fonction(){}
};
Par contre, si le typedef dans 'conteneur' évolue, il faut penser



à mettre à jour la définition de 'm_position'. Si on l'oublie, on
devrait s'en rendre compte à la compilation de conteneur.cxx ;
faut voir quel est le moindre mal...

Falk



Avatar
Manuel
"Falk Tannhäuser" a écrit dans le message de
news:
Manuel wrote:

"Falk Tannhäuser" a écrit dans le message
de


news:
Frédéric Mayot wrote:
[...]


fichier contenu.h ----
#include "conteneur.h"



Non! ce n'est ni nécéssaire, ni désirable
(pollution de l'espace de noms)
AMHA
Dans ce cas il me paraît difficile de faire référence à des membres de

'conteneur' dans 'contenu'.


Sorry... c'est toi qui a raison. J'avais simplement pas "vu" le typedef.
Je serai plus attentif avant de poster (surtout à 1h du matin ;-)

[snip]

--

- Manuel
to reply, swap the name with the domain.




Avatar
Fabien LE LEZ
On Thu, 12 Feb 2004 16:05:33 +0100, Frédéric Mayot
wrote:

Types incomplets


C'est la manière politiquement correcte de dire "unijambistes" ?

--
;-)