Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ A类';s的定义要求B类';s的定义,如何公开';在不暴露B'的情况下实现公共功能;什么是定义?_C++_Oop_Templates - Fatal编程技术网

C++ A类';s的定义要求B类';s的定义,如何公开';在不暴露B'的情况下实现公共功能;什么是定义?

C++ 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的定义,

假设我有以下库设计:我们为库用户公开class
A
,而不是class
B
。但是,类
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() {
   ...