1

エンジンで leveleditor クラスを作成するのに忙しいのですが、メンバー関数を別のメンバー関数のパラメーターとして渡すことに行き詰まっています。

まず、typedefを作成しました

typedef void (LevelEditor::*CallFunctionPtr)();

次に、ユーザーがヒット領域をマウスでクリックしたかどうかを確認するメンバー関数を作成しました。その場合は、別の関数を呼び出す必要があります。だから私は2つのパラメータを持つ私の最初のメンバー関数を持っています

LevelEditor.h

void CheckClickCollision(HitRegion* region, CallFunctionPtr callFunctionPtr);

LevelEditor.cpp

void LevelEditor::CheckClickCollision( HitRegion* region, CallFunctionPtr callFunctionPtr)
{
    if(GAME_ENGINE->GetLButtonMouseState())
    {
        if(!m_bIsLeftPressed && region->HitTest(m_MousePosition))
            (this->*callFunction)();

        m_bIsLeftPressed = true;
    }
    else
        m_bIsLeftPressed = false;   
}

次に、2 つのばかげたメンバー関数の例を示します。

LevelEditor.h

void LevelUp();
void LevelDown();

LevelEditor.cpp

void LevelEditor::LevelUp()
{
    ++m_iCurrentLevel;
}

void LevelEditor::LevelDown()
{
    if(m_iCurrentLevel > 0)
        --m_iCurrentLevel;
    else
        return;
}

そして今、ヒットがあるかどうかをチェックするためにティックごとにその関数を呼び出したいと思います。だから私のティック関数で:

CheckClickCollision(m_LeftArrowRegionPtr, LevelDown);
CheckClickCollision(m_RightArrowRegionPtr, LevelUp);

そしてここで、LevelDown と Levelup でエラーが発生します。

エラー: 型 void (LevelEditor::*)()" の引数は型 "CallFunctionPtr *" のパラメーターと互換性がありません

それを修正する方法がわかりません。さまざまなことを試しましたが、何も機能しませんでした

4

2 に答える 2

1

試す

CheckClickCollision(m_LeftArrowRegionPtr, &LevelEditor::LevelDown);
CheckClickCollision(m_RightArrowRegionPtr, &LevelEditor::LevelUp);

参考までに、実際のサンプルを次に示します (コンパイラは GCC 4.7 です)。

#include <stdio.h>

class LevelEditor;

typedef void (LevelEditor::*CallFunctionPtr)();

class LevelEditor
{
public:
    LevelEditor() {}

    void CheckClickCollision(void* region, CallFunctionPtr callFunction)
    {
        (this->*callFunction)();
    }

    void LevelUp() { printf("up\n"); }
    void LevelDown() { printf("down\n"); }

    void Test()
    {
        CheckClickCollision(NULL, &LevelEditor::LevelDown);
        CheckClickCollision(NULL, &LevelEditor::LevelUp);
    }
};

int main()
{
    LevelEditor e;
    e.Test();

    return 0;
}

これを呼び出す別の方法:

    void Test()
    {
        CallFunctionPtr p;
        p = &LevelEditor::LevelDown;
        CheckClickCollision(NULL, p);
        p = &LevelEditor::LevelUp;
        CheckClickCollision(NULL, p);
    }
于 2012-05-12T19:28:38.593 に答える
0

サポートしているコンパイラがある場合は、std::functionand 、または lambdasを使用する必要があります。std::bind

void LevelEditor::CheckClickCollision( HitRegion* region, std::function<void()> callFunction)
{
    if(GAME_ENGINE->GetLButtonMouseState())
    {
        if(!m_bIsLeftPressed && region->HitTest(m_MousePosition))
            callFunction();

        m_bIsLeftPressed = true;
    }
    else
        m_bIsLeftPressed = false;   
}

void Test()
{
    // lambda
    CheckClickCollision(NULL, [this] { LevelDown(); });
    // bind
    CheckClickCollision(NULL, std::bind(&LevelEditor::LevelDown, this));
}
于 2012-05-12T19:48:07.960 に答える