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) {
...
}
问题源于重载运算符无法访问AImpl
类,在 A
中声明为 private。
现在我有点进退两难,我应该如何解决这个问题。一种方法是声明类 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)
成为AImpl
的fried
。
/* 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;
...
}
相关文章:
- 从其他类访问类时遇到问题
- 0xC0000005:访问冲突读取位置 0x00000000. 重载 == 运算符的问题
- 初学者问题:如何访问此变量?
- 在C++中循环访问自定义结构列表的小问题
- 从资源视图访问对话框时出现问题
- 在 c++ 中创建和访问 4D 向量时出现问题
- 我遇到了一个糟糕的访问问题
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 简单的问题 - 如何从单独的"结构"内的'class'访问变量?
- 在 c++ 中访问列表向量时出现问题
- 消除 C++ 中的菱形问题以访问顶级成员
- C++字符串问题-如何访问字符串元素
- 在单元测试项目中包括 .c 文件,并从多个 cpp 文件访问它而不会出现链接问题
- 如果指针会产生访问私有成员等问题,为什么 C++ 允许指针?
- 访问单例类C++时出现问题
- 嵌套的类成员变量不可访问.链表设置.V、下一个和新的问题
- 通过此指针访问时的成员差异和自身的成员指针(简单的 QT 示例问题)
- 如何解决此C++访问冲突问题
- 操作员问题 - 访问冲突
- 问题5.3:访问/返回/调用动态创建的复选框(?)