Maison >développement back-end >C++ >Erreur de syntaxe C++ : les membres de la classe doivent être des types complets, comment y remédier ?
En programmation C++, les programmes ne parviennent souvent pas à se compiler correctement en raison de quelques erreurs simples. L’une des erreurs les plus courantes est que les membres de la classe doivent être des types complets. Ce message d'erreur indique que lors de la définition d'une variable membre de classe ou d'une fonction membre, le type de données utilisé n'est pas un type complet, ce qui empêche le compilateur de reconnaître le type de données du membre de classe.
Ce type d'erreur peut survenir en cas de références croisées entre classes. Par exemple, la classe A doit faire référence à la classe B, mais la classe B n'a pas été définie avant la déclaration de la classe A. À ce stade, cette erreur peut se produire lorsque les variables membres ou les fonctions membres définies dans la classe A impliquent la classe B.
Alors, comment gérer cette erreur ? Ci-dessous je vais vous proposer deux solutions possibles :
Méthode 1 : Classe pré-déclarée
Cette méthode est une solution relativement simple et efficace. Lors de la définition de la classe A, la classe B peut être déclarée à l'avance en dehors de la classe. De cette façon, lorsque la classe B est utilisée dans la classe A, le compilateur peut reconnaître ce type. L'implémentation du code est la suivante :
class B; //提前声明类B class A { private: B* b_ptr; public: void foo(); }; class B { private: int b_var; public: void bar(); }; void A::foo() { b_ptr = new B; } void B::bar() { b_var = 10; } int main() { A a_obj; a_obj.foo(); return 0; }
Dans le code ci-dessus, la classe B est d'abord déclarée à l'avance avant la classe A. De cette façon, la classe B peut être utilisée normalement lors de la définition de la classe A. Dans la classe A, un pointeur b_ptr pointant vers la classe B est défini et une valeur est attribuée au pointeur via la fonction membre foo(). Dans le même temps, la classe B définit également normalement ses propres variables membres et fonctions membres, et attribue des valeurs à la variable membre b_var via la fonction membre bar(). Enfin, une instance a_obj de classe A est créée dans la fonction principale et la fonction membre foo() est appelée. Le programme peut être compilé et exécuté correctement, et le message d'erreur « Les membres de la classe doivent être des types complets » n'apparaît plus.
Méthode 2 : utilisez des pointeurs ou des références au lieu d'objets
Si vous devez accéder à des variables membres ou à des fonctions membres dans une autre classe d'une classe, mais que vous ne pouvez pas mettre la définition de classe au début, cette méthode peut être utilisée. Dans ce cas, vous pouvez transmettre un pointeur ou une référence à l'objet au lieu de l'objet lui-même. Cela évite également les erreurs « les membres de la classe doivent être des types complets ». Le code est implémenté comme suit :
class B; //提前声明类B class A { private: B* b_ptr; public: void foo(); }; class B { private: int b_var; public: void bar(); }; void A::foo() { b_ptr = new B; b_ptr -> bar(); } void B::bar() { b_var = 10; } int main() { A a_obj; a_obj.foo(); return 0; }
Ici, les définitions de la classe A et de la classe B n'ont toujours pas changé, mais dans la fonction foo, on appelle la fonction membre bar() dans la classe B en opérant sur le pointeur b_ptr de la classe B. Parallèlement, dans la classe B, le même schéma est utilisé pour accéder à la variable membre b_var.
Les deux méthodes sont différentes, et le plan spécifique peut être choisi en fonction de vos besoins et de votre situation. Mais en général, ces solutions peuvent éviter les erreurs de compilation causées par « les membres de la classe doivent être des types complets ». J'espère que cet article vous sera utile.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!