0

私のメソッドの 1 つで、2 つのパラメーターを持つ関数が渡され、rightClick として保存されます。ただし、静的関数であるため、コンパイラは関数を前に初期化することを望んでいます。これについてどうすればいいですか?

マウス.cpp

void Mouse::clicked(int button, int state, int x, int y)
{
    if(button == GLUT_LEFT_BUTTON) {
        if(state == GLUT_DOWN) {
            isDragging = true;
            CurrentX = x;
            CurrentY = y;
        }
        else
        {
            isDragging = false;
        }
    }
    else if (button == GLUT_RIGHT_BUTTON)
    {
        if (state == GLUT_DOWN)
        {
            isDragging = true;
            rightClick(x,y);
        }
    }

}

void Mouse::setRightClickFunction(void (*func)(int, int))
{
    rightClick = func;
}

setRightClickFunction は、クリックする前に呼び出されます。今を除いて、私は別の問題を抱えています: "Mouse::rightClick", 参照元: Mouse::clicked(int, int, int, int) in Mouse.o

4

1 に答える 1

2

あなたのコメントに基づいて、「への未定義の参照についてリンカーエラーが発生していますMouse::rightClick。これは関数ポインターとは関係ありません。クラスで静的データメンバーを宣言するときはいつでも、それは単なる宣言です。定義する必要がありますどこか (= 正確に 1 つの .cpp ファイル内) にあります。

Mouseクラスが次のようになっていると仮定します。

class Mouse
{
  //...
  static void (*rightClick)(int, int);
  //...
};

この行を のどこかに入れる必要がありますMouse.cpp:

void (*Mouse::rightClick)(int, int) = 0;

これは、静的データ メンバーの定義として機能しますrightClick

于 2013-09-16T12:29:13.827 に答える