Déclarations a priori (Forward Class Declarations)

Il est possible en C++ de déclarer des class ou des struct sans en donner le détail (le type résultant est dit « incomplet » du fait qu'on ne connaît pas sa taille, ses services et sa structure interne). Ceci introduit le nom pour fins de compilation, ce qui permet entre autres. Il est possible d'utiliser ce nom à titre de type de retour d'une fonction, type de paramètre d'une fonction, de prendre un pointeur sur ce type, etc. (en fait : on peut utiliser ce type de toute manière n'impliquant pas d'en connaître la taille ou les services).

À titre d'exemple, ceci est illégal (inclusions circulaires; la tentative de mettre un Monde dans chaque Personne est suspecte) :

Monde.h Personne.h Personne.cpp
#ifndef MONDE_H
#define MONDE_H
#include "Personne.h"
#include <vector>
class Monde {
   std::vector<Personne> population;
   // ...
};
#endif
#ifndef PERSONNE_H
#define PERSONNE_H
// oups! Monde inclut Personne... qui inclut Monde
#include "Monde.h" 
class Personne {
   Monde ici;
   // ...
};
#endif
#include "Personne.h"
// ...

... alors que ceci est légal, éliminant la dépendance (inutile) de la classe Personne envers le détail de la classe Monde :

Monde.h Personne.h Personne.cpp
#ifndef MONDE_H
#define MONDE_H
#include "Personne.h"
#include <vector>
class Monde {
   std::vector<Personne> population;
   // ...
};
#endif
#ifndef PERSONNE_H
#define PERSONNE_H
// Ok; la classe Monde existe
class Monde; // <- déclaration a priori 
class Personne {
   Monde *ici; // <- Ok (pointeur de Monde)
   // ...
};
#endif
#include "Personne.h"
#include "Monde.h" // <- Ok (fichier source; ne sera
                   // pas inclus par d'autres)
// ...

Pour en savoir plus :


Valid XHTML 1.0 Transitional

CSS Valide !