如何将调用者对象作为参数发送给回调函数

问题描述 投票:0回答:1

如何从类对象自己的回调函数中访问其成员? 我尝试将调用者对象作为回调函数的参数发送,并从回调函数访问它。

在下面的代码中,我在这一行得到一个

error: invalid use of void expression
test.onEvent(onUpdateEvent(test));

一种解决方案是将测试对象定义为全局,并将 onEvent 函数定义为

void onEvent(const std::function<void()> &callback)
并从回调函数中删除参数。

但是我想知道是否还有其他方法。这是示例代码:

#include <iostream>

#include <functional>

class Test
{
  public:
    int x;
    void onEvent(const std::function<void(Test)> &callback)
    {
            Test_Callback = callback;
    };

    std::function<void(Test)> Test_Callback;     

    void Update()
    {
        x += 1;
        if (Test_Callback)
        {
            Test_Callback(.......);  <--- What parameter to use? If i use *this, i get the error i mentioned
        }
    }
};

void onUpdateEvent(Test& t)
{
    printf("update %d\r\n", t.x);
}

int main()
{
    Test test;
    test.onEvent(onUpdateEvent(test));

    while (1)
    {
        test.Update();   
    }

    return 0;
}

c++ std-function
1个回答
0
投票

问题是您使用函数调用的返回值onUpdateEvent(test)

作为参数。这是无效的,因为 
onUpdateEvent
void
 作为其返回类型。


因此,要解决此问题,请不要使用调用

onUpdateEvent(test)

 的返回值作为参数。相反,只需传递一个指向 
onUpdateEvent
 的指针作为参数,如下所示:

class Test { public: int x; void onEvent(const std::function<void(Test)> &callback) { Test_Callback = callback; }; //---------------------vvvvvvvvvvv------->same type as of onUpdateEvent's parameter std::function<void(const Test&)> Test_Callback; void Update() { x += 1; if (Test_Callback) { Test_Callback(*this); // <--- What parameter to use? If i use *this, i get the error i mentioned } } }; //-----------------vvvvv---------->added const here since this doesn't change anything void onUpdateEvent(const Test& t) { printf("update %d\r\n", t.x); } int main() { Test test; //------------------------v--> pass pointer to function as argument instead of passing return value as arg test.onEvent(onUpdateEvent); while (1) { test.Update(); } return 0; }

工作演示

© www.soinside.com 2019 - 2024. All rights reserved.