gpt4 book ai didi

c++ - A类的定义需要B类的定义,如何在不暴露B定义的情况下暴露A的公共(public)函数?

转载 作者:行者123 更新时间:2023-12-02 10:06:19 25 4
gpt4 key购买 nike

假设我有以下库设计:我们正在公开类 A对于图书馆用户,但不是类B .然而,类 A生成类 B 的实例供内部消费。有实现要求A必须生成 B 的实例使用私有(private)函数(即 A::getOneB() )。此外,生成的实例必须包装在智能指针中以进行安全的内存管理。

所以问题是: A.hpp 必须包含 B.hpp 所以 A::getOneB 的返回类型可以实例化,但会泄漏B对包括 的客户的定义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 {
};

最佳答案

Class A's definition requires class B's definition, how do I expose A's public functions without exposing B's definition?



如果需要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() {
...

关于c++ - A类的定义需要B类的定义,如何在不暴露B定义的情况下暴露A的公共(public)函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60046024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com