我有一个关于在 C++ 库中隐藏接口细节的问题。下面的例子说明了这个问题:
假设 w 有一个名为ISystem的类,它公开了Init、Run、Tick、Shutdown、GetXXXSubSystem 等方法。 其中 X 是各种接口的指针,例如:ISoundSystem、IInputSystem
我们还有 ISystem 的具体实现,例如: Win32System、OSXSystem等。
这些特定的实现使用 pimpl idiom 来隐藏内部结构,例如 Win32System 将 Win32RawInputSystem 实例化为 输入系统管理器。
所有这些管理器都有自己的Init、Run、Tick 和 Shutdown方法,它们不是接口的一部分(仅具体实现),它们由具体的系统实现运行和管理。
调用 GetXXXSubSystem 的用户在没有这些方法(Init 等)的情况下获得了接口指针,但他仍然可以将获得的指针转换为具体实现并触发他不应该访问的 Init Run Tick 等方法。
问题是,是否有可能以某种方式隐藏具体类?我试图在具体实现中保护这些方法,并将最终成为朋友的类型的类模板化,但这似乎是被禁止的,现有的 hack 不适用于 VC11。
我能想到的唯一方法是将具体的实现声明从头文件转移到 Win32System 类的 cpp 文件中,但我看到这样做的巨大缺点(甚至不确定这是否可行),因为这样每个子系统都会有成为这个 cpp 文件的一部分,这将成为可维护性的噩梦。
我正在考虑的另一个解决方案是使用工厂方法,例如
(RawInput.h)
IInputSystem* CreateRawInputSystem();
(RawInput.cpp)
class RawInput : public IInputSystem {}; ...
并将类的定义移动到 cpp 文件,但是,我将如何从我的库的其他部分(即在 Win32System impl 中)访问这种类型?
是否可以从其他 .cpp 文件中包含 .cpp 文件?
提前感谢您的任何提示。