c++ - 双包含解决方案?

标签 c++ include include-guards

在 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

中使用 Forward Declaration
#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 引用为指针时,您可以使用前向声明。

您可以使用前向声明来解决循环依赖问题。

进一步阅读:
When to use forward Declarations?

关于c++ - 双包含解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7665912/

相关文章:

c# - 将 PHP 中的代码转换为 C#

gradle - 包括未找到copySpec/同步任务Gradle

c++ - 内部与外部包括 guard

c++ - 语法错误 : missing ; before *

c++ - 类成员初始化是在编译时还是运行时进行?

module - **异常错误: undefined function eredis:start_link/0

c++ - 将空数据写入非阻塞套接字会导致 epoll_wait 挂起

c++ - Doxygen 要求记录一个 include-guard

Python C++ 扩展 - 内存泄漏或访问冲突

c++ - 使用 OpenCV 和 BCM2835 在 Raspberry Pi 上工作