我最近了解了 C++ 中的不透明指针。我已经开始使用它们来隐藏特定于平台的私有成员。例如引用<windows.h>
等中的定义。
现在,我有几个相互构建并需要相互通信的系统。例如,Direct3D 需要一个窗口句柄 (HWND)。我不想将平台定义暴露给我的核心系统,但是我的子系统需要传达这些数据。
我公开了不透明的数据并允许通过 void 指针进行访问。这允许访问所有私人数据。
示例用法(main.cpp):
// System:: namespace is my platform specific code
System::Window window;
System::DirectX::Direct3D9 gfxcontext(window);
窗口定义(System/Window.h):
class Window
{
WindowData* data; // Opaque pointer
public:
void* getHandle() const; // returns an HWND handle
Window();
~Window();
}
如何检索有用数据(Direct3D9.cpp):
#include "Window.h"
Direct3D9::Direct3D9(const Window& _window)
{
HWND windowHandle = *(HWND*)_window.getHandle();
// [...]
pp.hDeviceWindow = windowHandle;
}
但是,此代码有效!:
*(HWND*)_window.getHandle() = 0; // changes HWND in WindowData to NULL!
有没有办法在子系统之间交流平台特定信息而不将其暴露给我的独立代码 - 并保持私有数据的私密性?
编辑当前的 WindowData 实现
struct Window::WindowData
{
static LRESULT CALLBACK MessageHandler(HWND, UINT, WPARAM, LPARAM);
HWND windowHandle;
WNDCLASSEX windowClass;
HINSTANCE processInstance;
};
HWND 由 DirectX 在表示参数 ( D3DPRESENT_PARAMETERS::hDeviceWindow
)中使用