在C++中,使用getter函数来获取类名字符串通常不会遇到访问冲突问题。但是,如果你在使用CreateWindow函数时遇到了访问冲突问题,可能是因为类名字符串的访问权限设置不正确。
以下是一个示例代码,展示了如何使用getter函数来获取类名字符串,并避免访问冲突问题:
#include <iostream>
#include <Windows.h>
class MyClass {
private:
std::string className;
public:
MyClass(const std::string& name) : className(name) {}
std::string getClassName() const {
return className;
}
static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
// 获取MyClass实例的指针
MyClass* pMyClass = reinterpret_cast<MyClass*>(GetWindowLongPtr(hwnd, GWLP_USERDATA));
switch (uMsg) {
case WM_CREATE: {
// 将MyClass实例的指针保存到窗口的用户数据中
CREATESTRUCT* pCreateStruct = reinterpret_cast<CREATESTRUCT*>(lParam);
SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pCreateStruct->lpCreateParams));
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
};
int main() {
// 创建MyClass实例
MyClass myObject("MyClass");
// 注册窗口类
WNDCLASS wc = {};
wc.lpfnWndProc = MyClass::WindowProc;
wc.hInstance = GetModuleHandle(NULL);
wc.lpszClassName = myObject.getClassName().c_str();
if (RegisterClass(&wc)) {
// 创建窗口
HWND hwnd = CreateWindow(
myObject.getClassName().c_str(),
"Window Title",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
800, 600,
NULL, NULL,
GetModuleHandle(NULL),
&myObject);
if (hwnd) {
// 显示窗口
ShowWindow(hwnd, SW_SHOWDEFAULT);
// 消息循环
MSG msg = {};
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
return 0;
}
在上面的代码中,MyClass类中的getClassName函数用于获取类名字符串。在main函数中,我们首先创建了一个MyClass的实例myObject,并将其类名字符串用于注册窗口类。
在MyClass的静态成员函数WindowProc中,我们使用GetWindowLongPtr和SetWindowLongPtr函数来获取和保存MyClass实例的指针。在WM_CREATE消息中,我们从CREATESTRUCT结构中获取MyClass实例的指针,并将其保存到窗口的用户数据中。
这样,在消息处理过程中,我们就可以通过窗口句柄获取MyClass实例的指针,并使用其中的成员函数和成员变量。
请注意,以上代码仅为示例,可能还需要根据实际情况进行适当的修改。