[英]PIMPL idiom accessibility issue
我已经实现了我的课程,可以使用标准的PIMPL习惯用法来说A
类。
当我尝试为实现类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) {
...
}
问题源于无法在A
声明为private的AImpl
类的重载运算符。
现在,我在如何解决此问题上处于两难境地。 一种方法也是声明A
类的重载运算符。 另一种方法是将AImpl
类的私有声明公开。
哪种方法更好,更安全?
恕我直言,您滥用PIMPL习惯用语。 这个习惯用法要求实现是真正私有的,也就是说, AImpl
不应该在头文件中定义(每个人都可以看到),而应该在A.cpp
中定义, <<
运算符也应属于此。
如果这样做<<
运算符也没有必要在头文件中声明,那么访问PIMPL的唯一方法就是通过包含类。 您应改为定义ostream &operator <<(ostream &os, const A &obj)
并使其成为A
的friend
。
注意,使用这种方法, AImpl
不必对访问进行限制。 无论如何,它的字段和大小只能从A.cpp
。 但是,如果你想的内部AImpl
是private
,你可以做ostream &operator <<(ostream &os, const A &obj)
一fried
的AImpl
为好。
/* 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;
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.