Quand peut-on utiliser une déclaration anticipée (forward declaration) en C++ ?
Bonjour à tous ! J'apprends le C++ et je tombe constamment sur le terme "forward declaration" (déclaration anticipée). Je comprends à peu près ce que c'est, mais je ne saisis pas complètement quand il *faut* l'utiliser, et quand cela ne ferait que compliquer les choses.
Par exemple, j'ai deux classes : `A` et `B`. La classe `A` contient un pointeur vers `B`, et la classe `B` contient un objet `A` par valeur. J'essaie d'écrire quelque chose comme ça :
```cpp
// A.h
#include "B.h"
class A {
B* ptr;
};
// B.h
#include "A.h"
class B {
A obj;
};
```
Naturellement, cela ne compile pas à cause d'une dépendance cyclique. J'ai entendu dire qu'on peut utiliser une forward declaration pour briser ce cycle. Mais comment exactement ? Et dans quelles autres situations cela s'applique-t-il ?
J'ai aussi vu que dans les fichiers d'en-tête, on écrit parfois `class MyClass;` avant la définition de la classe. Pourquoi est-ce nécessaire, alors qu'on pourrait simplement inclure le fichier d'en-tête avec la définition complète ? Cela ne rend-il pas le code plus propre et plus clair ?
Expliquez-moi, s'il vous plaît, avec des exemples : quand la forward declaration est-elle vraiment utile, et quand vaut-il mieux l'éviter ?