gpt4 book ai didi

c++ - C++::在构造函数退出之前通过指针调用Member函数

转载 作者:行者123 更新时间:2023-12-01 14:57:41 24 4
gpt4 key购买 nike

我处于在构造函数执行期间将指向成员函数的指针共享给外部的情况。甚至可以在构造函数完成之前随时调用成员函数。我假设它可能导致未定义的行为。
在以下情况下会出现这种情况。

ButtonCtrl::ButtonCtrl(int id, HWND hwnd_parent, int x, int y,
int w, int h, const string& text)
{
this->hwnd = CreateWindowExW(0, L"BUTTON", this->wtext.c_str(),
WS_CHILD | WS_VISIBLE | WS_TABSTOP,
x, y, w, h, hwnd_parent, (HMENU)id,
GetModuleHandle(NULL), NULL);

this->wndproc_org = (WNDPROC) SetWindowLongW(this->hwnd, GWL_WNDPROC,
(LONG) &ButtonCtrl :: wndproc_new);
}

这里 wndproc_new 是静态类方法,但认为它不是静态的。现在,在 SetWindowLongW 方法中,我将Button的窗口过程替换为我的窗口过程( wndproc_new )。由于已经使用 CreateWindowExW 创建了按钮,因此消息循环可能已经开始。现在,它可以随时调用我的 wndproc_new 。甚至在此构造函数完成之前。所以我的问题是,我得到未定义的行为还是有效?

最佳答案

正式的,甚至从语言的 Angular 来看,您都可以从构造函数主体中调用成员函数,甚至可以调用虚函数。因为您的类的虚拟表(如果具有虚拟函数)将在构造函数主体之前初始化。另一个问题-您现在是否已初始化所有实例。我不是从构造函数中调用它,不是因为这是错误的,UB等(否),而是出于样式原因。

Now it can call my wndproc_new any time. even before this constructor got finish



这是错误的。 wndproc_new不中断。不能在任何时间调用它。仅当您调用一些可以调用窗口过程回调的具体api(例如 GetMessagePeekMessageWSendMessageCreateWindowEx等)时,系统才能调用此回调。您的 wndproc_new仅在此api调用内被调用,而不会在随机位置被调用。

另外请注意,即使对于32位代码,也需要使用 SetWindowLongPtrWGWLP_WNDPROC。我强烈怀疑是否需要更改默认的WC_BUTTON窗口过程。但是,如果确实需要它的子类-最好使用 SetWindowSubclass或类似 AtlThunk_*的方法

一般规则-仅在您准备好接听电话时才设置回叫。在任何时候(尽管在具体情况下 wndproc_new只能在多个api调用中并且只能从当前线程中调用)。无论如何,构造函数主体开始执行后-可以调用类的任何成员函数

关于c++ - C++::在构造函数退出之前通过指针调用Member函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61747010/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com