【问题标题】:Providing pointer to private member from within class从类中提供指向私有成员的指针
【发布时间】:2018-10-29 12:47:30
【问题描述】:

我意识到提供一个返回指向私有方法的指针的方法会破坏封装,并将该字段公开给使用该类的任何人。但是,假设如下:

你有一个类调用另一个类的方法(它需要一个指向某个私有字段的指针),并且私有成员的地址作为参数传递给这个方法。

据我所知,只要私有成员的地址仅以由类的开发人员控制的方式公开,这不会破坏封装(即开发人员确切知道它将如何使用) .当然,被调用的方法可以(假设你没有写)暴露私有成员,但是我们需要看那么远吗?我已经看过无数次了,所以我猜这不是糟糕的设计实践的结果?

编写带有指向其他类的私有成员的指针并修改它们的方法是不好的做法吗?每个班级应该只“照顾自己”吗?

【问题讨论】:

  • 答案将包含主观意见,因为对于是否将指向成员的指针公开“破坏封装”(不完全是一个精确的术语)有不同的看法。如果一个类有一个返回指向私有数据指针的公共成员函数,则隐含假设调用者不会滥用它。如果调用者是不可信的,那么最好不要提供这样的功能。如果一个成员函数将一个成员的地址传递给另一个函数,那么就会保持封装 - 封装并不是要防止其自己的成员函数故意采取行动。

标签: c++ oop pointers private


【解决方案1】:

我意识到提供一个返回指向私有方法的指针的方法会破坏封装,并将该字段公开给使用该类的任何人。

这不是真的。

具有返回指针作为其接口一部分的方法的类绝对没问题,它返回成员变量的事实是外部世界不需要的实现细节知道。

话虽如此,设计一个包含返回非拥有指针的函数的健全的类接口是困难,因此我们倾向于避免这种情况。

编辑就问题的第二部分而言:

任何类都应该合理地处理其公共接口的任何可能的使用变化(包括取消引用任何返回的指针)。什么或谁使用公共接口应该是完全不相关的,您应该假设该类的所有用户都将使用整个公共 API。

如果您只想将类的某些部分提供给特定类型或函数,那么这正是friend 的用途。但这与指向成员的指针无关,它适用于类的任何部分。

【讨论】:

  • 当然可以,但不知道它会如何使用。在这种情况下,它也可能是公开的。
  • 你对问题的另一部分有什么看法?
  • @B4039 我已经修改了答案。
  • 返回指向私有对象的指针基本上等同于将其公开。假设首先将其设为私有是有充分理由的,我几乎不相信这会绝对没问题
  • @GillesGouaillardet 拥有一个 getter 和一个 setter 基本上也相当于将某些东西公开。封装的重点是将接口与实现断开连接,仅此而已。如果接口有一个指针并且有意义,那就这样吧。现在,很难设计一个包含返回指针的合理接口,但这个困难与打破封装无关。
【解决方案2】:

这将是一个糟糕的设计,因为大多数类都有 getter 和 setter 来读取和写入对象。因此,如果该函数需要读写,那么它应该请求对象引用,而不是指向任何私有成员的指针。

在大多数情况下,当函数需要引用变量时,它会要求引用一个常量值。

【讨论】:

  • 如果方法需要以某种方式更改值怎么办?那么指针不是更可取吗?
  • 你能看到任何情况下方法接收指针是有意义的吗?
  • 在面向函数的编程中它是有意义的,但在面向对象的编程中,我认为接收指向非常量数据的指针是没有意义的。如果需要,那么您应该重新考虑您的课程设计。
  • 同样适用于非常量引用吗?那么在堆上分配数据时,你真的只会在内部类中使用指针吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-14
  • 2018-03-24
  • 2012-05-11
  • 2020-11-08
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多