- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经实现了我的类(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)
而是将其设为 friend
的 A
.
请注意,通过这种方法,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;
...
}
关于c++ - PIMPL习语无障碍问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33405880/
这是我们从文档中了解到的:public 属性的 getter 不能是私有(private)的(看起来合乎逻辑),所以: @Inject var repository: MyExampleReposit
是否可以在没有 block 的情况下使用 GCD?有没有办法像 mikeash 在他的 post 中所说的那样使用 _f 变体来使用 GCD? .我四处寻找,双方都没有证据。是可能还是不可能。 如果可
我一直在努力思考 的用法,以及我应该朝着哪个方向前进最容易接近。 应该总结列:在完美的情况下,每列在 中都有一个相应的摘要单元格. 不幸的是,这种情况几乎从来没有发生过。 通常只有几列包含数字数据
我是一名优秀的程序员,十分优秀!