繁体   English   中英

PIMPL习惯用法可访问性问题

[英]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)并使其成为Afriend

注意,使用这种方法, AImpl不必对访问进行限制。 无论如何,它的字段和大小只能从A.cpp 但是,如果你想的内部AImplprivate ,你可以做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;
     ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM