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 |
---|---|---|
|
|
|
... 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 |
---|---|---|
|
|
|
Pour en savoir plus :