变量的类型不完整

时间:2019-07-25 08:23:50

标签: c++ class declaration definition incomplete-type

我在b.cpp文件中创建了一个测试类(稍后将显示类)。 我也写了我的头文件c.h,该类存在class Test;

在我的main.cpp文件中,我想使用Test test_class = Test();创建班级的对象

编译器说:

  

变量“ Test test_class2”具有初始化程序,但类型不完整        测试test_class2 = Test();

     

无效使用了不完整的“类测试”类型        测试test_class2 = Test();

很明显,我在import "c.h"文件中使用main.cpp导入了c.h标头。

类测试:

#include <string>
#include <iostream>

#include "c.h"


class Test
{
public:
    Test()
    {
        a = 1;
    }

    int test_method()
    {
        return 0;
    }
private:
    int a;
};

`

3 个答案:

答案 0 :(得分:3)

据了解,标头c.h仅包含声明(未定义)

class Test;

因此在main中,该类的定义不可见。结果,编译器发出错误,因为它甚至不知道声明了该类的构造函数,并且由于该类的大小未知而无法为该类的对象分配内存(这意味着类型不完整) )。

您需要在标头中包含类定义,并将此标头包含在需要类定义的每个编译单元中。

最好像这样定义test_method

int test_method() const
{
    return a;
    //    ^^^
}

答案 1 :(得分:1)

这是一个类声明,但不是定义:

class Test;

为了实例化一个类,编译器必须已看到该类的定义(您发布的代码段)。如果您希望Test在实现(.cpp)文件中可用,请将定义放在头文件中。在需要完整定义Test的地方添加标头,就可以了。

答案 2 :(得分:0)

其他答案(和评论)告诉您您做错了什么。我认为,作为他们信息的补充,我将举一个小例子说明如何正确地做到这一点。

在头文件中(我将其称为Test.h,因此将类名和文件名绑定在一起),声明了该类及其能做什么:

#pragma once  // This prevents errors if the header is included multiple times

class Test
{
public:
    Test();
    int test_method();

private:
    int a;
};

将实现放入.cpp文件中(Test.cpp-与标头匹配):

#include "Test.h"

Test::Test()
{
    a = 1;
}

int Test::test_method()
{
    return 0; // Could also be "return a;" as another answer mentioned
}

然后最终可以像下面这样在main.cpp中使用它:

#include <iostream>
#include "Test.h"

int main()
{
    Test test_class = Test();
    std::cout << "Return value is: " << test_class.test_method() << std::endl;
    return 0;
}

还有其他方法可以执行此操作,但这是将代码分为可管理部分的基本,尝试和真实的方法。就目前而言,坚持使用这种方法应该可以使您受益匪浅。