我在C++中无效使用不完整的类型类错误,如何正确包含头文件?

I'm getting invalid use of incomplete type class errors in C++, how do I correctly include header files?

本文关键字:错误 何正确 包含头 文件 类型 无效 C++ 用不完 我在      更新时间:2023-10-16

这个问题以前已经出现过,但解决方案不适用于我的具体情况(或者我不知道如何将它们转移到我的代码中(。 我有这样的东西(简化为仅有问题的方法(

日历.hpp 文件:

#pragma once
#include "View.hpp"
class View;
class Calendar { 
View * v; 
public:
bool SetView(const View &newView) {
v = newView.clone(); 
return true; }

查看.hpp 文件:

#pragma once
#include "Calendar.hpp"
class Calendar;
class View {
public:
View(){};
virtual View * clone() const = ;

YearView.hpp 文件:

#pragma once
#include "View.hpp"
class View;
YearView : public View {
public:
YearView(){};
View * clone() const override {
return new YearView(); }

当我编译时,我在第 v = newView.clone(( 行中收到"无效使用不完整类型'const class View'"错误;

请问这是什么原因? Alse,有没有办法将YearView.hpp也包含在Calendar.hpp文件中?我想使用它来默认将日历构造函数中的"v"设置为特定类型YearView。

你在calendar.hppview.hpp之间有一个循环包含,我假设你试图通过添加前向声明来打破这个循环。

问题是您在标头中使用了前向声明的类。前向声明的类只能在声明中使用,不能创建类的新实例或调用其任何方法。

如果您将方法的实现移动到 cpp 文件中,那么它应该可以解决您的问题。

Calendar.hpp包括View.hpp其中包括Calendar.hpp...这是你需要打破的循环。

您可以通过不在View.hpp文件中包含Calendar.hpp来实现这一点。它应该有效,因为View.hpp实际上并没有使用Calendar.hpp中的任何内容。

所以View.hpp文件应该看起来像

#pragma once
class View {
...
};

不需要在其他头文件中对View进行前向声明,因为您包含View.hpp文件。并且需要包含View.hpp文件,因为View类不仅仅用于声明。

相关文章: