gpt4 book ai didi

c++ - PIMPL习语无障碍问题

转载 作者:行者123 更新时间:2023-11-28 06:00:26 25 4
gpt4 key购买 nike

我已经实现了我的类(class),让我们说类(class) A使用标准的 PIMPL 习语。
当我尝试重载时出现问题 <<我的实现类的运算符 AImpl

/* A.h */
class A {
public:
...
private:
class AImpl;
AImpl *impl;
}
/* Aimpl.h */
class AImpl {
...
friend ostream &operator <<(ostream &os, const AImpl &impl);
...
}
/* elsewhere.cpp */
ostream &operator <<(ostream &os, const AImpl &impl) {
...
}

问题源于重载的运算符无法访问 AImpl类,在 A 中声明为私有(private).
现在我对如何解决这个问题感到进退两难。一种方法是声明重载运算符 friend of class A也。另一种方法是对类进行私有(private)声明 AImpl公开。

哪种方法更好更安全?

最佳答案

恕我直言,您滥用了 PIMPL 习语。该成语要求实现真正私有(private),即 AImpl不应在头文件中定义(供所有人查看),而应该在 A.cpp 中定义还有<<运营商属于。

如果你这样做了 <<运算符在头文件中声明也是毫无意义的,无论如何,访问 PIMPL 的唯一方法是通过包含类。您将定义 ostream &operator <<(ostream &os, const A &obj)而是将其设为 friendA .

请注意,通过这种方法,AImpl不需要限制访问。它的字段和大小只能从 A.cpp 获得反正。但是如果你想制作 AImpl 的内部结构是private你可以制作ostream &operator <<(ostream &os, const A &obj)一个friedAImpl

/* A.h */
class A {
public:
...
private:
class AImpl;
AImpl *impl;

friend ostream &operator <<(ostream &os, const A &obj);
}

/* A.cpp */
class AImpl {
public:
// OR:
friend ostream &operator <<(ostream &os, const A &obj);

...
}

ostream &operator <<(ostream &os, const A &obj) {
AImpl* impl = obj.impl;
...
}

关于c++ - PIMPL习语无障碍问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33405880/

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