提问人:rwCapt 提问时间:7/12/2022 最后编辑:Remy LebeaurwCapt 更新时间:7/13/2022 访问量:125
“this”指针会改变吗?
Does the "this" pointer change?
问:
我正在使用 Win32 API 和一些包装本机 Win32 API 函数的 C++ 类,并管理窗口和应用程序本身。
因此,我还需要窗口过程()来获取和处理一些消息。WndProc()
为了处理这些消息,我使用 class-instance-pointer 访问类的一些成员函数:
Window* this_window = (Window*)GetWindowLongPtr(hWnd, GWLP_USERDATA);
但是在这里我有一个问题,这可能不是问题,但我不确定 C++ 标准如何定义这种情况。我正在使用该结构将指针保存在创建窗口的成员函数中。最后一个参数保存指针:CREATESTRUCT
this
this
CreateWindowExW(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, width, height, hWndParent, hMenu, hInstance, this);
对于此方法,指针不得更改。如果是这样,我会在函数中使用无效的指针。this
WndProc()
我可以相信指针不会改变吗?this
答:
1赞
Remy Lebeau
7/13/2022
#1
指针不会改变,但您必须确保它指向正确的内容。
的参数是 ,因此它将按原样获取任何指针。但是,您特别需要一个指针,因此请确保您首先存储一个指针。lpParam
CreateWindowEx()
void*
WndProc()
Window*
Window*
例如,如果您在派生自 的类中调用,则 will not .根据实际实现方式,不能保证指向同一 MyWindow
对象的指针和指针指向相同的内存地址。因此,您应该在将其传递给 之前从 到 上行,例如:CreateWindowEx()
MyWindow
Window
this
MyWindow*
Window*
MyWindow
Window*
MyWindow*
this
MyWindow*
Window*
SetWindowLongPtr(GWLP_USERDATA)
CreateWindowExW(..., static_cast<Window*>(this));
艺术
CreateWindowExW(..., this);
...
Window* this_window = static_cast<MyWindow*>(pcs->lpCreateParams);
SetWindowLongPtr(..., reinterpret_cast<LONG_PTR>(this_window));
...
评论
this
this
this
不能改变,它不可能.就连编译器也知道这一点,任何依赖于被更改或可以更改的代码,很多时候都会被编译器优化出来。为什么?因为它是永远不可能发生的废话代码。nullptr
this
nullptr
Window* this_window