Инициализация статического члена данных (класса) внутри класса C ++ - PullRequest
1 голос
/ 23 февраля 2012

Я пытаюсь объявить статический класс в родительском классе и инициализировать его, но, похоже, я получаю всевозможные ошибки.

/* 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 ]

4 голосов
/ 23 февраля 2012

Статические члены всегда состоят из объявления и определения , у вас нет определения в вашем файле cpp.Поместите следующую строку вне каких-либо функций:

MainWindow* MainWindow::hWin;

Вы можете прочитать подробнее здесь или здесь .

0 голосов
/ 23 февраля 2012

Использование статической переменной, как в вашем примере, не позволит вам иметь более одного экземпляра, поэтому лучше избегать этого, если это возможно.И в вашем примере нет необходимости использовать его, вместо этого вы можете легко использовать локальную переменную.

Просто удалите static MainWindow *hWin; из определения класса и измените MainWindow :: threadproc () для использования локальнойпеременная:

    DWORD WINAPI MainWindow::threadproc(void* param)
    {
        MainWindow* const hWin = static_cast<MainWindow*>(param);
        //hWin->whatever();
        return 0;
    }

Однако, если вы действительно хотите / должны использовать статическую переменную (по причинам, которые не очевидны в вашем примере), тогда я бы предложил установить ее в ctor MainWindow - итолько там.Нет необходимости явно передавать его в поток.

    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;
    }
...