Maison > développement back-end > C++ > Résoudre le problème de 'erreur : utilisation non valide d'un type 'class' non défini' dans le code C++

Résoudre le problème de 'erreur : utilisation non valide d'un type 'class' non défini' dans le code C++

WBOY
Libérer: 2023-08-26 13:58:51
original
1873 Les gens l'ont consulté

解决C++代码中出现的“error: invalid use of undefined type 'class'”问题

Résolvez le problème "Erreur : utilisation non valide d'un type 'classe' non défini" dans le code C++

En programmation C++, nous rencontrerons parfois un message d'erreur de compilation : "erreur : utilisation non valide d'un type 'classe' non défini". Cette erreur signifie que nous utilisons une classe non définie dans notre code.

Cette erreur se produit généralement dans les situations suivantes :

  1. J'ai oublié d'inclure le fichier d'en-tête de la classe.
  2. La déclaration prospective de la classe est incomplète.
  3. La définition de la classe se fait après utilisation.
  4. Les dépendances circulaires apparaissent dans les définitions de classe.

Pour mieux comprendre et résoudre ce problème, nous détaillerons ci-dessous chaque raison et fournirons des exemples de code correspondants.

  1. J'ai oublié d'inclure le fichier d'en-tête de la classe

C'est l'une des raisons les plus courantes. Lorsque nous utilisons un objet d'une certaine classe ou appelons sa fonction membre dans un fichier, nous devons d'abord inclure le fichier d'en-tête de la classe.

Par exemple, nous avons un fichier d'en-tête nommé "myClass.h" qui définit une classe nommée "myClass". Utilisez ensuite l'objet de cette classe dans "main.cpp" et appelez ses fonctions membres. Si nous oublions d'inclure "myClass.h" dans le fichier "main.cpp", cela provoquera des erreurs de compilation.

Voici un exemple :

myClass.h :

#ifndef MYCLASS_H
#define MYCLASS_H

class myClass {
public:
    void doSomething();
};

#endif
Copier après la connexion
Copier après la connexion

main.cpp :

#include <iostream>
// #include "myClass.h"  // 忘记包含头文件

int main() {
    myClass obj; // 编译错误:invalid use of undefined type 'class myClass'
    obj.doSomething();

    return 0;
}
Copier après la connexion

La solution est d'inclure le bon fichier d'en-tête dans "main.cpp", c'est à dire d'ajouter une ligne de code : # inclure " maClasse.h". #include "myClass.h"

  1. 类的前向声明不完整

在有些情况下,我们可能只需要知道类的存在而不必使用它的成员。这时,我们可以使用类的前向声明来解决。

然而,如果在使用类的成员时前向声明不完整,就会产生编译错误。

以下是一个示例:

myClass.h:

#ifndef MYCLASS_H
#define MYCLASS_H

class myClass {
public:
    void doSomething();
};

#endif
Copier après la connexion
Copier après la connexion

someClass.h:

#ifndef SOMECLASS_H
#define SOMECLASS_H

class someClass; // 不完整的前向声明

class otherClass {
public:
    void doSomethingWithSomeClass(someClass obj);
};

#endif
Copier après la connexion

someClass.cpp:

#include "myClass.h"
// #include "someClass.h"  // 忘记包含头文件

void otherClass::doSomethingWithSomeClass(someClass obj) {
    obj.doSomething(); // 编译错误:invalid use of undefined type 'class someClass'
}
Copier après la connexion

解决办法是在"someClass.cpp"中包含正确的头文件,即添加一行代码:#include "someClass.h"

    Déclaration avancée incomplète d'une classe
    1. Dans certains cas, nous pouvons avoir seulement besoin de connaître l'existence d'une classe sans utiliser ses membres. À ce stade, nous pouvons utiliser la déclaration forward de la classe pour le résoudre.

    Cependant, si la déclaration forward est incomplète lors de l'utilisation des membres d'une classe, une erreur de compilation se produira.

    Voici un exemple :

    myClass.h :

    #include "myClass.h"
    
    void myClass::doSomething() {
        // do something
    }
    
    void otherFunction() {
        myClass obj; // 编译错误:invalid use of undefined type 'class myClass'
    }
    Copier après la connexion

    someClass.h :

    #ifndef CLASSA_H
    #define CLASSA_H
    
    #include "classB.h"
    
    class classA {
        classB obj;
    };
    
    #endif
    Copier après la connexion
      someClass.cpp :
    1. #ifndef CLASSB_H
      #define CLASSB_H
      
      #include "classA.h"
      
      class classB {
          classA obj;
      };
      
      #endif
      Copier après la connexion
      La solution est d'inclure le fichier d'en-tête correct dans "someClass.cpp", c'est-à-dire d'ajouter une ligne du code :#include "someClass.h".

      Définition de classe après utilisation

      En C++, la définition de classe doit être avant utilisation. Si nous utilisons d’abord la classe puis la définissons, nous obtiendrons une erreur de compilation.

      Voici un exemple :

      myClass.cpp :

      rrreee

      La solution est de mettre la définition de la classe avant l'utilisation, ou la déclaration de la classe avant l'utilisation.

      Dépendances circulaires dans les définitions de classe🎜🎜🎜S'il existe des dépendances circulaires entre deux ou plusieurs classes, le compilateur ne pourra pas résoudre les dépendances entre elles, ce qui entraînera des erreurs de compilation. 🎜🎜Voici un exemple : 🎜🎜classA.h: 🎜rrreee 🎜classB.h: 🎜rrreee🎜La solution est d'essayer de réduire ou d'éliminer les dépendances circulaires entre les classes, comme en utilisant des déclarations avancées ou en réorganisant la structure du code. Si les dépendances circulaires ne peuvent être évitées, envisagez d'utiliser des classes d'interface ou des classes de base virtuelles pures pour résoudre les dépendances. 🎜🎜Résumé : 🎜🎜Grâce aux explications et aux exemples de code ci-dessus, nous pouvons mieux comprendre et résoudre le problème « erreur : utilisation non valide d'un type 'class' non défini » dans le code C++. Lors de l'écriture formelle du code, nous devons veiller à inclure les fichiers d'en-tête corrects, à compléter les déclarations directes, les définitions de classe avant utilisation et à éviter les problèmes tels que les dépendances circulaires pour garantir que le code peut se compiler et s'exécuter correctement. 🎜

      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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal