c++ - 友元的替代品?

标签 c++ encapsulation friend access-control

在下面的场景中,除了友元还有其他选择吗?

我有一个代表 UI 窗口的 Window 类。此外,作为单例实现的 WindowManager 类管理我的应用程序中的所有窗口对象(呈现 UI、调度事件等)

WindowManager 将有一个公共(public)接口(interface),仅包含其单例实例化方法和用于呈现 UI 和调度 UI 事件的函数。

我还希望 Window 对象在构造期间向 WindowManager 注册,并在销毁期间注销。 WindowManager::registerWindowManager::deregister 方法将是私有(private)的或 protected ,因为我不想要客户端(Window 对象除外) 才能使用此接口(interface)。

在这种情况下,有没有办法避免 WindowWindowManager 之间的友元?也许是一种完全不同的方式来实现类似的结果?

最佳答案

是的,但友元是最好的解决方案,因为它是为这种情况而设计的。

另一种方法是使 Window 成为 WindowManager 的成员(注意,这需要新的 C++11 可访问性规则)。或者让它派生自 WindowManager 的成员。或者让它派生自 WindowManager 本身。

您还可以在 Window 中放置一个私有(private)类型,在 Window 中嵌套一个只能由该私有(private)类型构造的键类型,并需要传递一个实例WindowManager 的键类型。这应该适用于 C++11 之前的编译器。

当然,任何方法都可以通过足够的转换来绕过。

关于c++ - 友元的替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7933672/

相关文章:

C++引用类型必须初始化

c++ - 未在命名空间中声明和定义的命名空间的类的 friend

c++ - 从 C++ 中的结构访问单个成员类型的所有元素

java - 为什么不直接使用属性而是使用 getXXX() 方法

c++ - 友元迭代器可以访问非静态数据成员吗?

C++创建一个函数的 friend ?

c++ - 在c++中显示小数点后两位

c++ - 将友元与继承结合起来访问私有(private)数据成员是否可以

c# - 在集合中封装引用类型

c++ - 是否可以调用注入(inject)的 friend 模板函数?