【问题标题】:C++ variable has initializer but incomplete type?C ++变量具有初始化程序但类型不完整?
【发布时间】:2012-04-03 23:40:06
【问题描述】:

我正在尝试使用以下命令在 C++ 中编译 2 个类:

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

但我收到以下错误:

Cat.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;
}

【问题讨论】:

  • 您不能为定义尚不可见的类声明对象。
  • @Ken:你必须包含头文件。

标签: c++ class compiler-construction


【解决方案1】:

有时,你forget to include the corresponding header时也会出现同样的错误。

【讨论】:

    【解决方案2】:

    当你需要一个完整的类型时,你使用前向声明。

    您必须拥有该类的完整定义才能使用它。

    通常的做法是:

    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"
    

    【讨论】:

    • 所以我不能将我的类定义放到不同的文件中?
    • @Ken 不,我不是这么说的。再次阅读答案。
    • 要不要在头文件中定义类的函数?
    • @Ken 不一定,你可以将方法定义留在cpp 文件中。
    • @Ken 这很简单,但有很大的不同。您应该阅读一本 C++ 入门书,其中详细解释了这些概念,除此之外还有更多内容。
    【解决方案3】:

    这与Ken的情况没有直接关系,但是如果您复制了.h文件并且忘记更改#ifndef指令,也会出现这样的错误。在这种情况下,编译器只会跳过类的定义,认为它是重复的。

    【讨论】:

    • 优秀的评论,我认为它涵盖了问题的最常见原因。这是因为复制或重命名头文件并忘记#ifndef 指令很棘手,而其他答案解决了忘记添加#include 语句,这是一个微不足道的错误。
    • 我的代码也有同样的问题,改#ifndef指令是什么意思。该指令已存在于所有头文件中。
    【解决方案4】:

    我在搜索解决方案时遇到了类似的错误并点击了此页面。

    如果您忘记在构建中添加 QT_WRAP_CPP( ... ) 步骤以运行元对象编译器 (moc),则使用 Qt 可能会发生此错误。包括 Qt 标头是不够的。

    【讨论】:

      【解决方案5】:

      您不能定义不完整类型的变量。您需要将Cat 的整个定义带入范围之前您可以在main 中创建局部变量。我建议您将类型 Cat 的定义移动到标题中,并从具有 main 的翻译单元中包含它。

      【讨论】:

      • 所以我必须将我的Cat 类放在带有main 的文件中?
      • @Ken:不,你必须阅读一本关于 C++ 的介绍书,其中将解释头文件和源文件的概念。
      • @Ken:用类的定义(和适当的保护)创建一个头文件,然后从 cat.cpp 和 cat_main.cpp 中包含它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-11
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多