최근 C++에서 불투명 포인터에 대해 배웠습니다. 나는 플랫폼 특정 사적인 멤버를 숨기기 위해 그것들을 사용하기 시작했다. <windows.h>
등의 정의에 대한 참조 등C++ 불투명 포인터의 개인 데이터 통신
이제 서로를 구축하고 상호 통신해야하는 몇 가지 시스템이 있습니다. 예를 들어, 윈도우 핸들 (HWND)을 필요로하는 Direct3D. 내 핵심 시스템에 플랫폼 정의를 공개하고 싶지는 않지만 내 하위 시스템은 해당 데이터를 전달해야합니다.
나는 불투명 한 데이터를 노출하고 void 포인터를 통해 액세스 할 수 있습니다. 이렇게하면 모든 개인 데이터에 액세스 할 수 있습니다.
사용 예제 (MAIN.CPP) :
// System:: namespace is my platform specific code
System::Window window;
System::DirectX::Direct3D9 gfxcontext(window);
윈도우 정의 (시스템/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를 프레젠테이션 매개 변수 (D3DPRESENT_PARAMETERS::hDeviceWindow
)
정확히 어떻게이 코드에'HWND'를 저장하고 있습니까?당신이 취할 수있는 접근 방식이 약간 다릅니다. 나는'pImpl' 해결책에 기대고있다. –
Mats, HWND를 포함하는 WindowData 코드를 추가했습니다. 비록 불투명 한 포인터가 pImple 이었지만 ... –