【发布时间】:2015-10-29 04:17:24
【问题描述】:
我已经实现了我的课程,比如说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 中声明为私有。
现在我对如何解决这个问题有点进退两难。一种方法是声明A 类的重载运算符朋友。另一种方法是对 AImpl public 类进行私有声明。
哪种方法更好更安全?
【问题讨论】:
-
是的,另一种方法是在
AImpl中定义operator<<,而不是仅仅声明它。通常情况下,使用 pImpl 时,“Impl”类最好放在“A.cpp”中,将声明和定义分开并没有什么好处,而且相当冗长。 -
这是用于序列化还是打印?通常,您不想打印班级的私人部分,因此您只需要一个运算符
-
除了 {{A.cpp}} 之外,您如何/为什么可以访问 {{AImpl}}?
标签: c++ access-modifiers pimpl-idiom