我正在处理具有单例的代码,我不想修改单例的类以添加方法“ void Connect(const int port)”,它将与“单例方法”相同void Connect()”,但不会显示一个对话框询问用户端口号。此方法更新了单身私人会员的地图...,我还需要新方法也更新此地图。
我想到了“ friend”关键字,但是这最后一个必须放在单例类中。
继承不起作用,因为我必须在代码的任何地方(不是我的)使用派生类中的单例。
在这种情况下您会怎么做?
答案 0 :(得分:2)
C ++不允许像某些其他语言一样将方法添加到现有类中。
如果您想做一些需要访问第三方库私有数据的事情,您确实需要使该库提供一些公开的东西。即使类似void SetConnection(SOCKET sock)
之类的东西,您99%的自定义内容也可以分开。写入此类私人成员的任何解决方法均不符合标准。
如果它是protected
,则继承可能会起作用,但是在单例的情况下,库将需要为您提供一种提供自己的实例的方法。
假设您在库中获得了一个合适的最小公共方法,那么您可以选择使用自由函数(例如void the_singleton_connect(int port)
),也可以使包装单个对象与其他方法一起在自己的代码中使用。
如果您真的想继续访问私有成员,那么请记住,在C ++中,它仅仅是包含声明的头文件。因此,您可以对其进行修改或为该类做出自己的兼容声明。这可能是将private
更改为public
的宏,您可以编辑文件以将该成员公开,添加friend
,添加其他方法,等等。只需将成员变量保留为以便不更改内存布局。
答案 1 :(得分:1)
这个(恕我直言,非常糟糕)的想法实际上可以做到。
1:复制头文件。
2:将函数定义添加到末尾。这不会破坏链接。
3:添加一个实现该文件的.cpp文件。