Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从类内提供指向私有成员的指针_C++_Oop_Pointers_Private - Fatal编程技术网

C++ 从类内提供指向私有成员的指针

C++ 从类内提供指向私有成员的指针,c++,oop,pointers,private,C++,Oop,Pointers,Private,我意识到,提供一个返回私有方法指针的方法会破坏封装,并向使用该类的任何人公开该字段。但是,假设以下情况: 您有一个调用另一个类的方法的类(该类需要指向某个私有字段的指针),私有成员的地址作为参数传递给该方法 就我所见,只要私有成员的地址仅以类的开发人员控制的方式公开,这就不会破坏封装(即开发人员确切地知道如何使用它)。当然,调用的方法可能(假设您没有编写它)公开私有成员,但是我们需要向前看吗?我已经看过无数次了,所以我想这不是糟糕的设计实践的结果吧 编写将指针指向其他类的私有成员并对其进行修改的

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

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

就我所见,只要私有成员的地址仅以类的开发人员控制的方式公开,这就不会破坏封装(即开发人员确切地知道如何使用它)。当然,调用的方法可能(假设您没有编写它)公开私有成员,但是我们需要向前看吗?我已经看过无数次了,所以我想这不是糟糕的设计实践的结果吧

编写将指针指向其他类的私有成员并对其进行修改的方法是否不好?每个班级应该只“为自己着想”吗

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

一开始就不是这样

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

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

编辑问题的第二部分:

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


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

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


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

当然可以,但不知道如何使用它。在这种情况下,它也可能是公开的。你对问题的另一部分有什么想法?@B4039我已经修改了答案。返回指向某个私有内容的指针基本上等同于将其公开。假设一开始就有一个很好的理由将其私有化,我几乎不相信这会是绝对好的。@GillesGouaillardet有一个getter和setter基本上等同于将某些东西公开。封装的要点是将接口与实现断开,而不是别的。如果接口有一个指针并且它有意义,那么就这样吧。现在,很难设计一个包含返回指针的合理接口,但这一困难与破坏封装无关。答案将包括主观意见,因为对于将指针暴露给成员是否“破坏封装”(不完全是一个精确的术语)有不同的看法。如果一个类有一个返回私有数据指针的公共成员函数,则存在一个隐式假设,即调用方不会滥用它。如果调用方不可信,那么最好不要提供这样的函数。如果一个成员函数将一个成员的地址传递给另一个函数,那么封装就得到了维护——封装不是为了防止它自己的成员函数进行有意的操作。如果该方法需要以某种方式更改该值,该怎么办?那么指针不是更好吗?你能看到任何情况下,方法接收指针是有意义的吗?在面向函数的编程中,这是有意义的,但在面向对象的编程中,我认为接收指向非常量数据的指针是没有意义的。如果需要的话,你应该重新考虑你的类设计。这同样适用于非常量引用吗?那么,在堆上分配数据时,您真的只在类内部使用指针吗?