我在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;
};
`
答案 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;
}
还有其他方法可以执行此操作,但这是将代码分为可管理部分的基本,尝试和真实的方法。就目前而言,坚持使用这种方法应该可以使您受益匪浅。