我正忙于在引擎中创建一个leveleditor类,但我被困在将一个成员函数作为另一个成员函数的参数传递上。
首先,我创建了一个类型定义函数
typedef void (LevelEditor::*CallFunctionPtr)();然后,我创建了一个成员函数来检查用户是否在点击区域时使用鼠标单击。如果是这样,则需要调用另一个函数。所以我的第一个成员函数有两个参数
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;
}然后我有两个愚蠢的成员函数示例:
LevelEditor.h
void LevelUp();
void LevelDown();LevelEditor.cpp
void LevelEditor::LevelUp()
{
++m_iCurrentLevel;
}
void LevelEditor::LevelDown()
{
if(m_iCurrentLevel > 0)
--m_iCurrentLevel;
else
return;
}现在,我想调用该函数的每一个节拍,以检查是否有一个命中。所以在我的tick函数中:
CheckClickCollision(m_LeftArrowRegionPtr, LevelDown);
CheckClickCollision(m_RightArrowRegionPtr, LevelUp);这里我得到了LevelDown和Levelup上的错误:
错误:类型为空(LevelEditor::*)()“的参数与类型为"CallFunctionPtr *”的参数不兼容
不知道如何修复它。尝试了不同的方法,都不起作用
发布于 2012-05-13 03:28:39
试一试
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-13 03:48:08
如果你有一个支持的编译器,你需要使用std::function和std::bind,或者lambda。
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));
}https://stackoverflow.com/questions/10566704
复制相似问题