c++ - 限制对类方法的访问

标签 c++ oop private encapsulation

我有一个 A 类,它具有公共(public)方法并被在不同应用程序中实现的 100 个其他类使用。现在我想将这些公共(public)方法设为私有(private),这样就没有新类可以访问它们,但我希望现有的客户端类仍然可以访问它们。 但我什至不想触及那些客户类,因为所有者很少允许在他们的类中产生任何涟漪。

我检查过

Can I access private members from outside the class without using friends?

C++: Is there a way to limit access to certain methods to certain classes without exposing other private members?

friend class with limited access

但所有(并非全部)都要求更改客户端代码。客户端代码不应更改。

一个直接的方法是让所有 N 类成为 friend ,但我不太愿意这样做。是否有任何模式或可接受的技术(请不要破解)来实现此访问限制? 谢谢,如果这是重复的,我深表歉意。

最佳答案

C++ 中的类是友元,以表明类之间特殊的有意强耦合。 friend 的使用实际上增强了封装,而不是像人们普遍认为的那样破坏它。
怎么样?
没有友元,将功能暴露给其他类的唯一非 hack 方法是提供 publicgetset 成员函数,这在事实上打破了封装,因为所有类(甚至那些不需要的类)现在都可以访问这些方法,因此成员增加了潜在破坏类数据的风险。

回到你的情况,如果你有 100 个类需要访问这个特定的类,那么你已经通过将这些方法作为 public 进行了正确的设计。现在试图让这些方法private 给 future 的类是在试图破解你现有的设计,你的设计不支持它。

将现有类作为 friend 并不完全符合上述标准,因此对于该场景来说不是一个好的选择。
但是,鉴于这种情况,您没有其他方法可以实现这一点。使现有类成为 friend 并授予它们特殊访问权限似乎是唯一的方法。这仍然很糟糕,因为 100 个只能访问少数方法的类现在可以访问您的整个类。

关于c++ - 限制对类方法的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8954221/

相关文章:

javascript - 是否可以阻止浏览器访问文本文件,但仍允许 JavaScript 访问?

C++单词解密器

java - 代码结构 : Interface implemented by many classes or a huge single-responsibility class?

c++ - 如何在C++中获取嵌套类的实例

c++ - C++中的静态构造函数?我需要初始化私有(private)静态对象

c# - 用于实现静态方法的静态字典字段

c++ - 使用 gSOAP 和 Apache 部署网络服务

c++ - C++ 支持的类型的表达式语法是什么?

c++ - 如何使用 Material 的环境色代替灯光的全局环境色? (OpenGL 1)

ios - 尝试用我在 Swift 中称为 'living model' 的东西构建一些东西。认为我可能做错了