首页 > 解决方案 > 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 {
};

标签: c++ooptemplates

解决方案


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() {
   ...

推荐阅读