1

親クラス内で静的クラスを宣言して初期化しようとしていますが、あらゆる種類のエラーが発生しているようです。

/* 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数日間問題に悩まされており、非常にイライラしています.

4

2 に答える 2

4

静的メンバーは常に宣言定義で構成され、cpp ファイルに定義がありません。次の行を関数の外に置きます。

MainWindow* MainWindow::hWin;

詳細については、こちらまたはこちらをご覧ください。

于 2012-02-23T12:42:03.447 に答える
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;
    }
于 2012-02-23T12:58:33.863 に答える