初始化类C++中的静态数据成员(类)

Initializing a static data member (class) within a class C++

本文关键字:数据成员 静态 C++ 初始化      更新时间:2023-10-16

我试图在父类中声明一个静态类并对其进行初始化,但似乎遇到了各种错误。

/* 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;
    }