web-dev-qa-db-fra.com

La variable C ++ a un initialiseur 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_main.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 fondamentalement est de créer une classe (Cat.cpp) et créez 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;
}
46
user569322

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

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

La façon habituelle de s'y prendre est la suivante:

1) créer un fichier Cat_main.h

2) déplacer

#include <string>

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

à Cat_main.h. Notez que dans 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 et Cat.cpp:

#include "Cat_main.h"
42
Luchian Grigore

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

9
Dmitriy Sukharev

Vous ne pouvez pas définir une variable d'un type incomplet. Vous devez mettre toute la définition de Cat dans la portée avant vous pouvez créer la variable locale dans main. Je vous recommande de déplacer la définition du type Cat vers un en-tête et de l'inclure à partir de l'unité de traduction comportant main.

J'ai eu une erreur similaire et j'ai frappé cette page en cherchant la solution.

Avec Qt, cette erreur peut survenir si vous oubliez d’ajouter l’étape QT_WRAP_CPP( ... ) dans votre construction pour exécuter le compilateur de métaobjets (moc). Inclure l'en-tête Qt n'est pas suffisant.

1
peter karasev

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

0
xtluo