68 votes

Une variable C++ a un initialisateur mais un type incomplet ?

J'essaie de compiler 2 classes en C++ avec la commande suivante :

g++ Cat.cpp Cat_main.cpp -o Cat

Mais je reçois l'erreur suivante :

Cat.cpp:10:10: error: variable ‘Cat Joey’ has initializer but incomplete type

Quelqu'un pourrait-il m'expliquer ce que cela signifie ? Ce que mes fichiers font essentiellement, c'est créer une classe ( Cat.cpp ) et créer une instance ( Cat_main.cpp ). Voici mon code source :

Cat.cpp :

#include <iostream>
#include <string>

class Cat;

using namespace std;

int main()
{
    Cat Joey("Joey");
    Joey.Meow();

    return 0;
}

Cat_main.cpp :

#include <iostream>
#include <string>

using namespace std;

class Cat
{
    public:
        Cat(string str);
    // Variables
        string name;
    // Functions
        void Meow();
};

Cat::Cat(string str)
{
    this->name = str;
}

void Cat::Meow()
{
    cout << "Meow!" << endl;
    return;
}

59voto

Luchian Grigore Points 136646

Vous utilisez une déclaration directe lorsque vous avez besoin d'un type complet.

Vous devez disposer d'une définition complète de la classe pour pouvoir l'utiliser.

La façon habituelle de procéder est la suivante :

1) créer un fichier Cat_main.h

2) déménager

#include <string>

class Cat
{
    public:
        Cat(std::string str);
    // Variables
        std::string name;
    // Functions
        void Meow();
};

a Cat_main.h . Notez qu'à l'intérieur de l'en-tête, j'ai enlevé using namespace std; et chaîne qualifiée avec std::string .

3) inclure ce fichier dans les deux Cat_main.cpp y Cat.cpp :

#include "Cat_main.h"

24voto

xtluo Points 871

Parfois la même erreur se produit lorsque vous forget to include the corresponding header .

18voto

Dmitriy Sukharev Points 469

Ce n'est pas lié directement au cas de Ken, mais une telle erreur peut également se produire si vous avez copié .h et a oublié de changer #ifndef de la directive. Dans ce cas, le compilateur va simplement sauter la définition de la classe en pensant qu'il s'agit d'une duplication.

5voto

Vous ne pouvez pas définir une variable d'un type incomplet. Vous devez apporter la définition complète de Cat dans le cadre avant vous pouvez créer la variable locale dans main . Je vous recommande de déplacer la définition du type Cat à un en-tête et l'inclure à partir de l'unité de traduction qui a main .

1voto

peter karasev Points 1136

J'ai eu une erreur similaire et je suis tombé sur cette page en cherchant la solution.

Avec Qt, cette erreur peut se produire si vous oubliez d'ajouter l'option QT_WRAP_CPP( ... ) dans votre compilation pour exécuter le compilateur d'objets méta (moc). Inclure l'en-tête Qt n'est pas suffisant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X