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

时间:2012-02-23 12:37:27

标签: c++ class static initialization redefinition

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

/* 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问题纠缠了几天而且非常沮丧。

2 个答案:

答案 0 :(得分:4)

静态成员始终由声明定义组成,您缺少cpp文件中的定义。将以下行放在任何函数之外:

MainWindow* MainWindow::hWin;

您可以阅读更多herehere

答案 1 :(得分:0)

使用类似示例的静态变量不允许您拥有多个实例,因此最好尽可能避免使用它。在您的示例中,不需要使用一个,您可以轻松地使用局部变量。

只需从类定义中删除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;
    }