0

以下のコードから次のエラーが発生しました。

error: invalid use of member 'calls_object::OBJECT' in static member function| error: from this location

ラインOBJECT->call();ライン29から。

基本的に、関数は静的である必要があります。これは、Windowsスレッドを作成するコードの実際の簡略化バージョンであるためです。静的関数内でポインターを使用できないようですが、静的関数内でオブジェクトを作成することは問題ありません。別の方法はありますか?

CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)windowsthread, (LPVOID)i, NULL, &m_id);

static DWORD_PTR WINAPI windowsthread()
{
    OBJECT->call();
}

l

class object
{
        private:

        public:

        object(){}
        ~object(){}
        void call(){}
};
class calls_object
{
    private:

        object* OBJECT;

    public:

    calls_object()
    {
        OBJECT = new object();
    }
    ~calls_object(){}

    #ifdef _WIN32
    static void windows_function()
    {
        OBJECT->call();
    }
    #endif
};
int main()
{
    calls_object O;

}
4

2 に答える 2

2

この機能:

static void windows_function()
{
    OBJECT->call();
}

として宣言されていstaticます。これは、暗黙的なポインターを受け取らないことを意味します。つまり、 のインスタンスthis動作しません。したがって、メンバー変数を参照できません。calls_objectOBJECT

関数を非静的として宣言するかOBJECTstaticメンバー変数として宣言します (アプリケーションでより意味のあるものは何でも)。

Windowsスレッドを作成するコードの実際の単純化されたバージョンであるため、基本的に関数は静的でなければなりません

CreateThread(残念ながら)関数ポインタを受け取る関数 ( ) を扱っているため、 を使用することさえできませんstd::bind。ただし、ポインター ( への 、 のプロトタイプを参照)CreateThreadを受け入れる関数を提供できます。voidThreadProc

objectの 4 番目の引数としてan へのポインターを渡し、そのポインターCreateThreadwindowsFunction(void*)受け取ります。windowsFunction()またはグローバルのままである内でstatic(実際には、クラスはまったく必要ありませんcalls_object)、そのポインターをポインターにキャストしてobject呼び出すことができcall()ます。


また、のコンストラクターで作成したポインターをcalls_object忘れているため、クラスがメモリ リークしていることにも注意してください。deletecalls_object

~calls_object() 
{ 
    delete object; // DON'T FORGET THIS!
}
于 2013-03-03T13:56:09.567 に答える
1

windows_functioncalls_objectは静的メンバー関数であるため、どのオブジェクトにも関連付けられていません。OBJECTは非staticデータ メンバであるため、オブジェクトに関連付けられていcalls_objectます。staticデータ メンバーから非データ メンバーにアクセスすることはできません。

関数を non-staticにするだけで機能します。

このように考えてください。タイプのオブジェクトを作成することさえせずcalls_objectmain関数が次のようなものである場合:

int main()
{
  calls_object::windows_function();
}

この関数はどこから取得されるとOBJECT思いますか? OBJECTは非メンバーであるためstatic、オブジェクトの一部としてのみ存在しcalls_objectます。staticメンバー関数はOBJECT、どこからともなく単純にプルすることはできません。

于 2013-03-03T13:56:11.057 に答える