c++ - A类的定义需要B类的定义,如何在不暴露B定义的情况下暴露A的公共函数?
问题描述
假设我有以下库设计:我们A
为库用户公开 class ,但不公开 class B
。但是,类A
生成类的实例B
供内部使用。有一些实现要求A
必须生成B
使用私有函数(即A::getOneB()
)的实例。此外,生成的实例必须包装在智能指针中以进行安全的内存管理。
所以问题是:A.hpp必须包含B.hppA::getOneB
以便可以实例化的返回类型,但这会将B
's 的定义泄露给包含A.hpp的客户端。我们如何防止这种情况发生?
A.hpp // 我们将其导出以供客户端代码使用 A::foo()。
#include "B.hpp"
class A {
public:
void foo(); // the public API
private:
std::unique_ptr<B> getOneB(); // the internal API that returns a fresh B to consume. We need smart pointer for auto memory management.
};
B.hpp // 我们没有导出这个,我们不想让客户端代码知道 B。
class B {
};
解决方案
A类的定义需要B类的定义,如何在不暴露B定义的情况下暴露A的公共函数?
如果需要B的定义,那么就无法避免B定义的暴露。所以,解决方法是改变前提:改变A,使其定义不再依赖于B的定义。
在这种情况下,只需将成员函数替换为自由函数,不需要在定义 A 的头文件中声明。
另一种方法是引入一个不透明的包装类:
struct BWrapper;
class A {
BWrapper getOneB();
};
// outside the header;
#include "B.hpp"
struct BWrapper {
std::unique_ptr<B> b_ptr;
};
BWrapper A::getOneB() {
...
推荐阅读
- javascript - 如果条件不满足,则数组中返回空值和逗号,JS映射箭头函数
- python-3.x - 如何针对 Anaconda Python 中的 R(相关强度)值应用阈值标签?
- laravel - Laravel 5.8 本地查询范围与数据透视表,返回相关模型
- testing - 我应该用柏树测试一个缩小的生产版本吗?
- visual-studio-2017 - MFC 多字节支持
- javascript - 画布停止工作时
- ios - 用户在后台时更新位置 - 快速
- github - 为什么我在 travis 中收不到构建失败的电子邮件通知
- rest - 从 Visual Basic 调用 REST API
- system-verilog - 从多个端口(在不同代理中)连接到一个出口(在记分牌中)