我正在尝试使用以下命令在C ++中编译2个类:
g++ Cat.cpp Cat_main.cpp -o Cat
但是我收到以下错误:
Cat_main.cpp:10:10: error: variable ‘Cat Joey’ has initializer but incomplete type
有人可以向我解释这意味着什么吗?我的文件基本上是创建一个类(Cat.cpp
)并创建一个实例(Cat_main.cpp
)。这是我的源代码:
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;
}
答案 0 :(得分:40)
当您需要完整类型时,可以使用前向声明。
您必须拥有该类的完整定义才能使用它。
通常的解决方法是:
1)创建文件Cat_main.h
2)移动
#include <string>
class Cat
{
public:
Cat(std::string str);
// Variables
std::string name;
// Functions
void Meow();
};
到Cat_main.h
。请注意,在标题内我删除了using namespace std;
和带有std::string
的限定字符串。
3)在Cat_main.cpp
和Cat.cpp
中包含此文件:
#include "Cat_main.h"
答案 1 :(得分:9)
它直接与Ken的案例无关,但如果您复制 .h 文件并忘记更改#ifndef
指令,也会出现此类错误。在这种情况下,编译器将跳过类的定义,认为它是重复的。
答案 2 :(得分:4)
您无法定义不完整类型的变量。您需要在之前将Cat
的整个定义纳入范围,您可以在main
中创建局部变量。我建议您将类型Cat
的定义移至标题,并将其包含在main
的翻译单元中。
答案 3 :(得分:1)
我遇到了类似的错误,并在搜索解决方案时点击了此页面。
使用Qt,如果您忘记在构建中添加QT_WRAP_CPP( ... )
步骤以运行元对象编译器(moc),则会发生此错误。包括Qt标头是不够的。
答案 4 :(得分:0)
有时,当您forget to include the corresponding header
时,会发生相同的错误。