首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将成员函数作为成员函数的参数传递

将成员函数作为成员函数的参数传递
EN

Stack Overflow用户
提问于 2012-05-13 03:23:31
回答 2查看 282关注 0票数 1

我正忙于在引擎中创建一个leveleditor类,但我被困在将一个成员函数作为另一个成员函数的参数传递上。

首先,我创建了一个类型定义函数

代码语言:javascript
运行
复制
typedef void (LevelEditor::*CallFunctionPtr)();

然后,我创建了一个成员函数来检查用户是否在点击区域时使用鼠标单击。如果是这样,则需要调用另一个函数。所以我的第一个成员函数有两个参数

LevelEditor.h

代码语言:javascript
运行
复制
void CheckClickCollision(HitRegion* region, CallFunctionPtr callFunctionPtr);

LevelEditor.cpp

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
void LevelUp();
void LevelDown();

LevelEditor.cpp

代码语言:javascript
运行
复制
void LevelEditor::LevelUp()
{
    ++m_iCurrentLevel;
}

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

现在,我想调用该函数的每一个节拍,以检查是否有一个命中。所以在我的tick函数中:

代码语言:javascript
运行
复制
CheckClickCollision(m_LeftArrowRegionPtr, LevelDown);
CheckClickCollision(m_RightArrowRegionPtr, LevelUp);

这里我得到了LevelDown和Levelup上的错误:

错误:类型为空(LevelEditor::*)()“的参数与类型为"CallFunctionPtr *”的参数不兼容

不知道如何修复它。尝试了不同的方法,都不起作用

EN

回答 2

Stack Overflow用户

发布于 2012-05-13 03:28:39

试一试

代码语言:javascript
运行
复制
CheckClickCollision(m_LeftArrowRegionPtr, &LevelEditor::LevelDown);
CheckClickCollision(m_RightArrowRegionPtr, &LevelEditor::LevelUp);

为方便起见,以下是工作示例(编译器为GCC 4.7):

代码语言:javascript
运行
复制
#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;
}

另一种叫法是:

代码语言:javascript
运行
复制
    void Test()
    {
        CallFunctionPtr p;
        p = &LevelEditor::LevelDown;
        CheckClickCollision(NULL, p);
        p = &LevelEditor::LevelUp;
        CheckClickCollision(NULL, p);
    }
票数 1
EN

Stack Overflow用户

发布于 2012-05-13 03:48:08

如果你有一个支持的编译器,你需要使用std::functionstd::bind,或者lambda。

代码语言:javascript
运行
复制
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));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10566704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档