2012-02-23 11 views
1

親クラス内で静的クラスを宣言して初期化しようとしていますが、すべてのエラーが発生しているようです。クラス内の静的データメンバ(クラス)の初期化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の問題に絡み合っており、非常に不満です。

+1

どのようなエラーメッセージが表示されますか? – Lol4t0

+0

C++には静的クラスはありません。あなたが持っているものは、静的なデータメンバです。 – sbi

答えて

4

静的メンバーは常に宣言定義から成り、あなたのcppファイルの定義を欠いています。

MainWindow* MainWindow::hWin; 

あなたはhereよりかhereを読むことができます:任意の関数の外に次の行を入れてください。

+0

'エラー:C2655: 'MainWindow :: hWin':現在のスコープで定義または再宣言が不正です'、 'error:C2086: 'MainWindow * MainWindow :: hWin'私はあなたのコードを使用するときに再定義します。 – user99545

+0

答えを更新しました。定義を関数の外に置く必要があります。 – soulmerge

+0

私はなぜC++が関数の外でそれを要求するほど厄介なのか理解していません。投稿したリンクを読んでいただきます、ありがとうございます。 – user99545

0

あなたの例のような静的変数を使用すると、複数のインスタンスを持つことができないので、可能であれば避けるのが最善です。また、あなたの例では、使用する必要はありませんが、代わりにローカル変数を簡単に使用することができます。

ただ、ローカル変数を使用して、あなたのクラス定義からstatic MainWindow *hWin;を削除し、メインウィンドウを変更:: 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; 
    } 
関連する問題