双包括解决方案?

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指针作为指针即可使用前向声明.

您可以使用前向声明来克服循环依赖性问题.

进一步阅读:
何时使用前向声明?


Cat*_*lus 5

这是一个循环依赖.不要制作它们.你可以通过#include "Stage.h"在stuffcollection.h中替换Stage(即class Stage;)的前向声明来解决这个问题.