在C+中实现对的回调+;? 标题要求,我发现自己无法在C++中实现一个简单的(HA)回调函数。

在C+中实现对的回调+;? 标题要求,我发现自己无法在C++中实现一个简单的(HA)回调函数。,c++,C++,现在,如果你认为“我肯定我以前看到过关于这个问题的问题/答案”,你是绝对正确的,即: 我重新发帖的原因是我无法得到任何工作。我已经尝试将我完全理解的第一个答案[1]直接应用到我的代码中;但我有30个错误 这30个错误中的第一个问题,我不明白。它与typedef声明有关: typedef std::tr1::function<int (const GameCharacter&)> HealthCalcFunc; 以下错误使人想起丢失的“;”失踪或类似: ..\..gLib

现在,如果你认为“我肯定我以前看到过关于这个问题的问题/答案”,你是绝对正确的,即:

我重新发帖的原因是我无法得到任何工作。我已经尝试将我完全理解的第一个答案[1]直接应用到我的代码中;但我有30个错误

这30个错误中的第一个问题,我不明白。它与typedef声明有关:

  typedef std::tr1::function<int (const GameCharacter&)> HealthCalcFunc;
以下错误使人想起丢失的“;”失踪或类似:

..\..gLib\..sor.h(47) : error C2143: syntax error : missing ';' before '<'
..\..gLib\..sor.h(47) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
..\..gLib\..sor.h(47) : error C2238: unexpected token(s) preceding ';'
..\..gLib\..sor.h(51) : error C2061: syntax error : identifier 'DataProcessorFunc'
..\..gLib\..sor.h(104) : error C2146: syntax error : missing ';' before identifier 'callbackFunc'
在我的文件(主要是.cpp)中,我放置了函数定义和主函数:

#include <QCoreApplication>
#include "class1.h"

using namespace std;

void callback(int value) {
     printf("callback: got %d\n", value);
}

void do_something(int value, void (*cb)(int)) {
     // do something
     cb(value); // call the callback
}

void do_anotherthing(int value, std::function<void(int)> const& cb) {
    cb(value);
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    A theA = A();
    do_anotherthing(45, theA.callback);

    // Original exercise, works fine
    do_something(42, callback);
    return a.exec();
}

最后,我想花一点时间来表达我的无限感激之情,感谢各位在我需要在这里发布问题的时候所提供的知识和快速的回复。非常感谢大家。

我想有人会质疑你完全理解答案的说法

为了理解这一点,我认为你应该从问题的正确方向开始,切掉所有干扰核心问题的杂音。让我们从简单的C-ish解决方案开始:

void callback(int value) {
     printf("callback: got %d\n", value);
}

void do_something(int value, void (*cb)(int)) {
     // do something
     cb(value); // call the callback
}

int main() {
    do_something(42, callback);
    return 0;
}
没什么特别的-回调只是指向随后被调用的函数的指针

下一步可能是观察如果您想将一个方法传递给
do\u something
,而不是普通的函数,会发生什么。它将失败,因为方法与函数的类型不同(因为它们不能以相同的方式使用,方法需要调用对象,而函数不需要)。这意味着您必须使用指向(a)类成员的指针:

class A {
    void callback(int value) {
        printf("callback: got %d\n", value);
    }
};

void do_something(int value, A* obj, void (A::*cb)(int)) {
    (obj->*cb)(value);
}
然而,这有一个问题,您已经限制自己使用class
a
的方法作为回调-您不能再使用普通函数作为回调。这里的
std::function
起到了解救作用,因为它使用了一个包装器,可以在单个对象中包装任何类型的可调用项

void do_something(int value, std::function<void(int)> const& cb) {
    cb(value);
}
void do_某事(int值,std::function const&cb){
cb(价值);
}

然后你可以用任何形式的回调来调用它。

我认为人们可以质疑你完全理解答案的说法

为了理解这一点,我认为你应该从问题的正确方向开始,切掉所有干扰核心问题的杂音。让我们从简单的C-ish解决方案开始:

void callback(int value) {
     printf("callback: got %d\n", value);
}

void do_something(int value, void (*cb)(int)) {
     // do something
     cb(value); // call the callback
}

int main() {
    do_something(42, callback);
    return 0;
}
没什么特别的-回调只是指向随后被调用的函数的指针

下一步可能是观察如果您想将一个方法传递给
do\u something
,而不是普通的函数,会发生什么。它将失败,因为方法与函数的类型不同(因为它们不能以相同的方式使用,方法需要调用对象,而函数不需要)。这意味着您必须使用指向(a)类成员的指针:

class A {
    void callback(int value) {
        printf("callback: got %d\n", value);
    }
};

void do_something(int value, A* obj, void (A::*cb)(int)) {
    (obj->*cb)(value);
}
然而,这有一个问题,您已经限制自己使用class
a
的方法作为回调-您不能再使用普通函数作为回调。这里的
std::function
起到了解救作用,因为它使用了一个包装器,可以在单个对象中包装任何类型的可调用项

void do_something(int value, std::function<void(int)> const& cb) {
    cb(value);
}
void do_某事(int值,std::function const&cb){
cb(价值);
}

然后您可以使用任何类型的回调调用它。

在开发C++11规范时,
std::tr1
名称空间只是实验性的,现在已经过时了。改用。推荐阅读:@JoachimPileborg谢谢!我尝试了
typedef std::/*tr1::*/function
std::tr1
命名空间在开发C++11规范时只是实验性的,现在已经过时了。改用。推荐阅读:@JoachimPileborg谢谢!我尝试了
typedef std::/*tr1::*/functionskyking:谢谢你的详细解释,这正是我所需要的。然而,我仍然对std::函数不满意,因为它显然不存在。我将编辑我的问题来说明。@PhilPhil您是否删除了
tr1
名称空间?你有没有加入
?啊哈,我不知道那里有一个
库。在我的代码中包含这一点大大减少了错误的数量。非常感谢。不幸的是,我不知道如何在第三段代码中调用
do\u something
。即,如何解析第二个参数(
&cb
)。虽然我认为你的答案与我的问题相符,但我意识到我的问题与我的问题不符(已经咨询过我的老板)。所以我会记下你的答案是正确的,然后回到课本上。谢谢你的知识和耐心。天空之王:谢谢你的详细解释,这正是我所需要的。然而,我仍然对std::函数不满意,因为它显然不存在。我将编辑我的问题来说明。@PhilPhil您是否删除了
tr1
名称空间?你有没有加入
?啊哈,我不知道那里有一个
库。在我的代码中包含这一点大大减少了错误的数量。非常感谢。不幸的是,我不知道如何在第三段代码中调用
do\u something
。即,如何解析第二个参数(
&cb
)。虽然我认为你的答案与我的问题相符,但我意识到我的问题与我的问题不符(已经咨询过我的老板)。所以我会记下你的答案是正确的,然后回到课本上。谢谢你的知识和耐心。
class A {
    void callback(int value) {
        printf("callback: got %d\n", value);
    }
};

void do_something(int value, A* obj, void (A::*cb)(int)) {
    (obj->*cb)(value);
}
void do_something(int value, std::function<void(int)> const& cb) {
    cb(value);
}