我在C++中无效使用不完整的类型类错误,如何正确包含头文件?
I'm getting invalid use of incomplete type class errors in C++, how do I correctly include header files?
这个问题以前已经出现过,但解决方案不适用于我的具体情况(或者我不知道如何将它们转移到我的代码中(。 我有这样的东西(简化为仅有问题的方法(
日历.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.hpp
和view.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
类不仅仅用于声明。
相关文章:
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 无法在我的堆排序代码中找到错误.无法正确执行.C++
- Static_cast转换为错误的数据类型,但结果仍然正确?
- 任何人都可以弄清楚这段代码如何显示运行错误?它打印无限时间 -1 以及正确答案
- 如何在类模板的成员函数中正确调用函数对象?正在生成 Visual Studio 编译器错误 C2440
- 未声明的标识符错误,但变量定义正确 (?)
- 我的代码中是否有任何类型的错误,因为它没有给出正确的输出
- 失败,出现错误 87:参数不正确.如何判断哪个参数不正确?
- 即使我的代码没有错误,我也没有得到正确的输出
- 宏定义不正确没有错误
- 为什么 MSVC 在使用正确的签名覆盖函数时会产生 C3668 错误?
- C++ CURL 库链接器错误,但包含正确的库
- 交换两个字符串时访问正确的内存时,我遇到了分段错误
- 如何避免 boost 的野兽body_limit错误并正确处理大消息
- rpmbuild check-rpath 报告错误,指出路径不是绝对的,不正确的
- 对从引用到 std::reference_wrapper 或编译器错误的隐式转换的理解不正确?
- C++代码在 for 循环的条件下给出运行时错误,而如果它被具有相同意义的代码替换,则编译正确
- C++处理sqlite3_prepare和sqlite3_step错误的正确方法
- 在处理线程时,处理错误的正确方法是什么
- Visual Studio 2015中的广义Lambda捕获表达式:编译器错误或正确行为