Ben*_*Ben 3 c++ include-guards include
在C++中,我有一个双重包含问题:
文件stuffcollection.h
#pragma once
#ifndef STUFFCOLLECTION_H
#define STUFFCOLLECTION_H
#include "Stage.h"
class Stuffcollection {
public:
bool myfunc( Stage * stage );
};
#endif // STUFFCOLLECTION_H
Run Code Online (Sandbox Code Playgroud)
文件stage.h:
#pragma once
#ifndef STAGE_H
#define STAGE_H
#include "Stuffcollection.h"
class Stage {
// stuffcollection used in stage.cpp
};
#endif // STAGE_H
Run Code Online (Sandbox Code Playgroud)
编译器错误:
\Stuffcollection.h|(line were bool myfunc is declared)|error: 'Stage' has not been declared|
||=== Build finished: 1 errors, 0 warnings ===|
有人可以解释为什么会发生这种情况以及如何解决这个问题?我已经使用include guard和pragma一次预处理器指令,它只是不起作用.
(如果我#include "Stuffcollection.h"从stage.h中删除并注释掉在stage.cpp中使用它的相应行,那么我的其余代码就可以正常工作了.这真的只是在将Stuffcollection包含到舞台中时突然停止工作.)
PS:舞台只是一个例子,我几乎每隔一个文件都使用stuffcollection,每次我都遇到这个问题.
编辑:我按照建议,现在的问题是invalid use of incomplete type,即虽然给出的答案解决了循环依赖的问题,但他们没有解决我正在处理的问题.我的问题在循环依赖/不完整类型中继续.
编辑:现在两个都解决了.
Alo*_*ave 13
你有一个循环依赖.而是使用前向声明中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
Run Code Online (Sandbox Code Playgroud)
基本原理:
您可以在上面的代码段中使用前向声明,因为Stuffcollection.h只使用指针Stage.
说明:
使用类的前向声明Stage,编译器不知道它的组成也不知道其中的成员,编译器只知道它Stage是一个type.因此,
Stage是编译器的不完整类型.对于不完整的类型,我们无法创建它的对象或做任何需要编译器知道布局的事情,Stage或者Stage只是一个类型的事实.由于指向所有对象的指针只需要相同的内存分配,因此只需将Stage指针作为指针即可使用前向声明.
您可以使用前向声明来克服循环依赖性问题.
进一步阅读:
何时使用前向声明?
这是一个循环依赖.不要制作它们.你可以通过#include "Stage.h"在stuffcollection.h中替换Stage(即class Stage;)的前向声明来解决这个问题.