C ++变量有初始值但不完整的类型?

时间:2012-03-19 13:22:38

标签: c++ class compiler-construction

我正在尝试使用以下命令在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;
}

5 个答案:

答案 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.cppCat.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时,会发生相同的错误。