如何解析此标头包含循环
How to resolve this header include loop?
嗨,我已经阅读了有关此主题的类似问题,但我无法解决我的问题。我想我必须做一个转发声明,所以我尝试了以下内容。
我有三个类A,B和接口A
定义接口A
#ifndef INTERFACE_A_H
#define INTERFACE_A_H
#include "B.h"
namespace Example
{
class B; // Forward declaration?
class InterfaceA
{
Example::B test;
};
}
#endif
确定A类
#ifndef A_H
#define A_H
#include "InterfaceA.h"
namespace Example
{
class A : public Example::InterfaceA
{
};
}
#endif
定义类 B
#ifndef B_H
#define B_H
#include "A.h"
namespace Example
{
class A; // Forward declaration?
class B
{
Example::A test;
};
}
#endif
主要
#include "A.h"
#include "B.h"
int main()
{
Example::A a;
Example::B b;
}
我在视觉工作室中收到以下错误:
"example::B::test"使用未定义的类"example::A"
编辑:到目前为止,感谢您的所有帮助。这是非常有帮助的。我认为我的问题是我在实际项目中的设计非常糟糕。我会改变这一点。
除此之外,我现在对转发声明有了更好的理解:-)
如果您确实需要类 A 引用类 B,反之亦然,而不是将 A 和 B 的实例作为数据成员,请考虑使用指针,例如:
// A.h
#pragma once
#include <memory> // for std::unique_ptr
// Forward declaration (A references B using pointer)
class B;
class A
{
...
std::unique_ptr<B> m_pB;
};
同样:
// B.h
#pragma once
#include <memory> // for std::unique_ptr
// Forward declaration (B references A using pointer)
class A
class B
{
...
std::unique_ptr<A> m_pA;
};
附言与您的问题的核心无关,但请注意,我使用#pragma once
而不是"旧式"#ifndef/#define/#endif
包括警卫; 对我来说,#pragma once
似乎更简单、更清晰。
您正在创建循环依赖关系。修改您的设计。
你真的需要 B 内部的 A 类和 A 内部的 B 类实例吗?
如果它们需要共享头信息,则使它们都继承自同一个父头文件。
相关文章:
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 如何在for循环中包含两个索引值的测试条件
- C++-字符串是否包含一个带有简单循环的单词
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- C++:返回一个基于范围 for 循环迭代器,其中包含继承对象
- 循环访问还包含未使用元素的字符串数组
- 如果代码包含多个复杂度循环,如何计算复杂度
- 在包含窗口标头时难以解决循环依赖关系问题
- 在命名空间内使用函数的循环包含
- 解决C++中 3 个类的循环包含
- 我该如何循环遍历我的数组(缓冲区——包含一个文本文件),并将其打印成30字节的块
- 如何在C++中创建 2d 数组,其中一部分包含循环计数器,另一部分包含数字列表?
- 错误:尽管不是包含循环,但"*"标记之前仍存在预期的")"
- 如何使螺纹包含循环使用静音以控制流动
- 头文件包含循环和多重定义
- C ++如何包含(循环依赖)
- 如何解析此标头包含循环
- C++包含循环
- 包含循环作为表达式的宏
- 如何在C++中声明两个相互包含(循环依赖)的类,并使用分隔符