初始化类C++中的静态数据成员(类)
Initializing a static data member (class) within a class C++
我试图在父类中声明一个静态类并对其进行初始化,但似乎遇到了各种错误。
/* MainWindow.h */
class MainWindow
{
private:
static DWORD WINAPI threadproc(void* param);
static MainWindow *hWin;
};
/* MainWindow.cpp */
#include "MainWindow.h"
void MainWindow::on_pushButton_clicked()
{
HANDLE hThread = CreateThread(NULL, NULL, threadproc, (void*) this, NULL, NULL);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
}
DWORD WINAPI MainWindow::threadproc(void* param)
{
hWin = (MainWindow*) param;
//Be able to access stuff like hWin->run();
return 0;
}
我尝试过使用MainWindow::hWin = (MainWindow*) param;
和MainWindow::hWin = new MainWindow((MainWindow*) param));
以及其他许多方法,但似乎都不起作用。做这件事的正确方法是什么?关于这个问题,有人会推荐什么资源吗?我已经纠结class
问题好几天了,非常沮丧。
静态成员总是由声明和定义组成,您的cpp文件中缺少该定义。将以下行置于任何功能之外:
MainWindow* MainWindow::hWin;
你可以在这里或这里阅读更多。
使用像您的示例中那样的静态变量将不允许您拥有多个实例,因此如果可能的话,最好避免它。在您的示例中,不需要使用局部变量,您可以很容易地使用局部变量。
只需从类定义中删除static MainWindow *hWin;
,并修改MainWindow::threadproc()以使用本地变量:
DWORD WINAPI MainWindow::threadproc(void* param)
{
MainWindow* const hWin = static_cast<MainWindow*>(param);
//hWin->whatever();
return 0;
}
然而,如果你真的想/必须使用一个静态变量(原因在你的例子中并不明显),那么我建议在MainWindow的ctor中设置它——就在那里。无需显式地将其传递给线程。
MainWindow::MainWindow()
{
assert(hWin == 0);
hWin = this;
}
MainWindow::~MainWindow()
{
assert(hWin == this);
hWin = 0;
}
void MainWindow::on_pushButton_clicked()
{
HANDLE hThread = CreateThread(0, 0, threadproc, 0, 0, 0);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
}
DWORD WINAPI MainWindow::threadproc(void*)
{
// just use hWin, it already points to the one and only MainWindow instance
return 0;
}
相关文章:
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 静态数据成员模板专用化的实例化点在哪里
- 调用在 HXX 文件中声明的静态数据成员
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 错误: 无效使用非静态数据成员"应用程序::应用程序构造函数"
- 静态数据成员:它"const declaration / constexpr definition"起作用?
- 何时需要定义类的静态数据成员 (un/-)
- 为什么静态数据成员不能在c++11中的类中初始化
- 静态数据成员的模板专用化
- 拒绝包含某些公共静态数据成员的类型
- GCC:在调试构建中优化的静态数据成员
- 类模板静态数据成员定义/声明/初始化
- C++ 中的静态数据成员
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- 使用 lambda 函数初始化静态数据成员
- 引用静态数据成员
- 学习C++并在早期示例中遇到错误(在非静态数据成员之前需要构造函数)
- Windows 上的 Clang/LLVM 7 和 8 多次初始化内联静态数据成员(使用 link.exe 和 lld-
- 为什么不能使用"( )"为类的非静态数据成员提供默认值?
- 不带初始值设定项的 constexpr 静态数据成员