从类中提供指向私有成员的指针
Providing pointer to private member from within class
我意识到提供一个返回指向私有方法的指针的方法会破坏封装,并将字段暴露给使用该类的任何人。但是,假设以下内容:
您有一个类,它调用另一个类的方法(它需要一个指向某个私有字段的指针(,并且私有成员的地址作为参数传递给此方法。
据我所知,只要私有成员的地址仅以类开发人员控制的方式公开,这就不会破坏封装(即开发人员确切地知道它将如何使用(。当然,调用的方法可以(假设你没有编写它(暴露私有成员,但我们是否需要展望那么远?我已经看过无数次了,所以我想这不是糟糕的设计实践的结果吗?
编写将指针指向其他类的私有成员并对其进行修改的方法是否不好?每个班级应该只"照顾自己"吗?
这将是一个糟糕的设计,因为大多数类都有getter和setter来读取和写入对象。因此,如果该函数需要读取和写入,那么它应该请求对象引用,而不是指向任何私有成员的指针。
在大多数情况下,当函数需要对变量的引用时,它会要求引用常量值。
我意识到提供一个返回指向私有方法的指针的方法会破坏封装,并将该字段暴露给使用该类的任何人。
这从一开始就不是真的。
具有返回指针作为其接口一部分的方法的类绝对没问题,并且它返回成员变量这一事实是外部世界不需要知道的实现细节。
话虽如此,很难设计一个涉及返回非拥有指针的函数的理智类接口,因此我们倾向于避免这样做。
编辑问题的第二部分:
任何类都应该理智地处理其公共接口的任何可能的使用排列(包括取消引用任何返回的指针(。使用公共接口的内容或人员应该是完全无关紧要的,您应该假设该类的所有用户都将使用整个公共 API。
如果你有只希望对特定类型或函数可用的类部分,那么这正是friend
的用途。但这与指向成员的指针无关,它适用于类的任何和所有部分。
- 从成员指针到整个结构/类的强制转换
- OOP 中的单成员指针
- 使用结构成员指针在C++中填充结构
- 聚合初始化,将成员指针设置为同一结构成员
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 共享 C++ 的数据成员指针
- 如何声明指向成员内容的成员指针m_pmd/m_pmf并访问它们?
- 从类C++外部调用指向成员方法的成员指针
- 结构成员指针是否自动初始化为零?
- 如何删除类内类类型的类成员指针
- 是否打印指向已定义 int 的成员指针
- 指向常量的成员指针
- 通过此指针访问时的成员差异和自身的成员指针(简单的 QT 示例问题)
- 类数据成员指针的非类型模板参数包无法使用 gcc 编译
- 为什么我不能在同一行中定义两个相同类型的类的成员指针
- 将类成员指针传递给 Lambda 捕获列表 c++11
- 在单一实例类中将成员指针设置为 null 的正确方法是什么
- 无法删除在destructor中的成员指针的课程
- 删除对象而不调用成员指针的析构函数
- 当派生类的基类具有成员指针时,对其进行深层复制