在 C++ 中,我遇到了双重包含的问题:
文件stuffcollection.h
#pragma once
#ifndef STUFFCOLLECTION_H
#define STUFFCOLLECTION_H
#include "Stage.h"
class Stuffcollection {
public:
bool myfunc( Stage * stage );
};
#endif // STUFFCOLLECTION_H
文件stage.h:
#pragma once
#ifndef STAGE_H
#define STAGE_H
#include "Stuffcollection.h"
class Stage {
// stuffcollection used in stage.cpp
};
#endif // STAGE_H
编译器错误:
\Stuffcollection.h|(已声明 bool myfunc 的行)|错误:'Stage' 尚未声明|
||=== 构建完成:1 个错误,0 个警告 ===|
有人可以解释为什么会发生这种情况以及如何解决吗?我已经使用了 include guards 和 pragma once 预处理器指令,但它不起作用。
(如果我从 stage.h 中删除 #include "Stuffcollection.h"
并注释掉在 stage.cpp 中使用它的相应行,我的其余代码工作正常。这真的就在将 Stuffcollection 纳入阶段时,它突然停止工作。)
PS:stage 只是一个例子,我也在几乎所有其他文件中使用了 stuffcollection,每次我遇到这个问题。
编辑:我遵循了建议,现在的问题是invalid use of incomplete type
,即虽然给出的答案解决了循环依赖的问题,但它们不要解决我正在处理的问题。我的问题在 Circular Dependencies / Incomplete Types 中继续.
编辑:现在都解决了。
最佳答案
您有一个循环依赖。而是在 Stuffcollection.h
#pragma once
#ifndef STUFFCOLLECTION_H
#define STUFFCOLLECTION_H
//#include "Stage.h" //<------------------Don't Do This
class Stage; //<------------------Do This
class Stuffcollection {
public:
bool myfunc( Stage * stage );
};
#endif // STUFFCOLLECTION_H
理由:
您可以在上面的代码片段中使用前向声明,因为 Stuffcollection.h
仅使用指向 Stage
的指针。
解释:
使用类Stage
的前向声明,编译器不知道它的组成和里面的成员,编译器只知道Stage
是一个类型
。因此,
Stage
是编译器的不完整类型。对于 Incomplete types ,人们无法创建它的对象或做任何需要编译器知道 Stage
布局的事情,或者除了 Stage
只是一种类型这一事实之外。由于指向所有对象的指针只需要相同的内存分配,因此当仅将 Stage
引用为指针时,您可以使用前向声明。
您可以使用前向声明来解决循环依赖问题。
关于c++ - 双包含解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7665912/