C++ A类';s的定义要求B类';s的定义,如何公开';在不暴露B'的情况下实现公共功能;什么是定义?
假设我有以下库设计:我们为库用户公开classC++ A类';s的定义要求B类';s的定义,如何公开';在不暴露B'的情况下实现公共功能;什么是定义?,c++,oop,templates,C++,Oop,Templates,假设我有以下库设计:我们为库用户公开classA,而不是classB。但是,类A为内部消费生成类B的实例。有一些实现要求,A必须使用私有函数(即,A::getOneB())生成B的实例。此外,生成的实例必须包装在智能指针中,以实现安全的内存管理 因此,问题是:A.hpp必须包含B.hpp,因此可以实例化A::getOneB的返回类型,但这会将B的定义泄漏给包含A.hpp的客户端。我们如何防止这种情况 A.hpp//我们正在导出此文件,以便客户端代码使用A::foo() 类A的定义需要类B的定义,
A
,而不是classB
。但是,类A
为内部消费生成类B
的实例。有一些实现要求,A
必须使用私有函数(即,A::getOneB()
)生成B
的实例。此外,生成的实例必须包装在智能指针中,以实现安全的内存管理
因此,问题是:A.hpp必须包含B.hpp,因此可以实例化A::getOneB
的返回类型,但这会将B
的定义泄漏给包含A.hpp的客户端。我们如何防止这种情况
A.hpp//我们正在导出此文件,以便客户端代码使用A::foo()
类A的定义需要类B的定义,如何在不公开B的定义的情况下公开A的公共函数
如果需要B的定义,那么你无法避免B的定义的暴露。所以,解决方案是改变前提:改变A,使其定义不再依赖于B的定义
在这种情况下,只需将成员函数替换为自由函数,而不需要在定义
另一种方法是引入不透明包装器类:
struct BWrapper;
class A {
BWrapper getOneB();
};
// outside the header;
#include "B.hpp"
struct BWrapper {
std::unique_ptr<B> b_ptr;
};
BWrapper A::getOneB() {
...
struct BWrapper;
甲级{
bwraper getOneB();
};
//在收割台外侧;
#包括“B.hpp”
结构BWrapper{
std::唯一的\u ptr b\u ptr;
};
BWrapper A::getOneB(){
...
<代码> >代码> UNQuijyPTR 需要完整的类型。你考虑过PIML范式吗?谷歌……@ NaNaOLIVER,我的坏。想到“代码> SydDypTrp/代码>你了解过正向声明吗?”JesperJuhl,如@ NaNaulver说,前向声明将不起作用,因为B的类定义是必需的。你是SU吗?G指定getOneB()的名称到另一个类并让A持有该类的一个实例?@DXZ我在写答案时认为B
是该类的一个成员。现在我看到它是一个函数,不清楚它为什么是一个成员函数。也许最简单的解决方案是用一个不需要在cl中声明的自由函数替换它屁股,这肯定是一条出路。
class B {
};
struct BWrapper;
class A {
BWrapper getOneB();
};
// outside the header;
#include "B.hpp"
struct BWrapper {
std::unique_ptr<B> b_ptr;
};
BWrapper A::getOneB() {
...