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;
}
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"
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.
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.
Parfois, la même erreur se produit lorsque vous forget to include the corresponding header
.