gpt4 book ai didi

c++ - 在 C++ 中实现回调?

转载 作者:太空宇宙 更新时间:2023-11-04 16:07:17 24 4
gpt4 key购买 nike

正如标题所问,我发现自己无法在 C++ 中实现一个简单的 (ha) 回调函数。

现在,如果您在想“我确定我之前已经看过这个问题/答案”,那么您绝对正确,即:Callback functions in c++

我重新发帖的原因是我什么都做不了。我已经尝试将我完全理解的第一个答案 [1] 直接应用到我的代码中;但是我得到了 30 个错误。

这30个错误的第一个问题,我没看懂。它与 typedef 声明有关:

  typedef std::tr1::function<int (const GameCharacter&)> HealthCalcFunc;

似乎缺少“tr1”:

..\..gLib\..sor.h(47) : error C2039: 'function' : is not a member of 'std::tr1'

以下错误让人联想到缺少“;”失踪或类似情况:

..\..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'

向下移动页面,还有另一个答案 [2] 显得更加明显。所以我用这两个类创建了一个新项目,但错误再次打败了我;我发现自己无法进步。

...\gamecharactertest\class1.h(17) : error C2146: syntax error : missing ';' before identifier 'F1'
...\gamecharactertest\class1.h(17) : error C2182: 'CALLBACK' : illegal use of type 'void'
jom: ...\GameCharacterTest\Makefile.Release [release\class1.obj] Error 2
...\gamecharactertest\class1.h(17) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
...\gamecharactertest\class1.h(17) : warning C4183: 'F1': missing return type; assumed to be a member function returning 'int'
...\gamecharactertest\class1.h(19) : error C2143: syntax error : missing ':' before '}'
class1.cpp(11) : error C2143: syntax error : missing ';' before 'C1::F1'
class1.cpp(11) : error C2182: 'CALLBACK' : illegal use of type 'void'
class1.cpp(12) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
[...]
...\gamecharactertest\class2.h(16) : error C2143: syntax error : missing ')' before '<tag>::*'
...\gamecharactertest\class2.h(16) : error C2657: 'C1::*' found at the start of a statement (did you forget to specify a type?)
...\gamecharactertest\class2.h(16) : error C2059: syntax error : ')'
...\gamecharactertest\class2.h(16) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
...\gamecharactertest\class2.h(16) : warning C4183: 'pfnCallBack': missing return type; assumed to be a member function returning 'int'
...\gamecharactertest\class2.h(21) : error C2061: syntax error : identifier 'pfnCallBack'
class2.cpp(10) : error C2061: syntax error : identifier 'pfnCallBack'
class2.cpp(14) : error C2065: 'pFn' : undeclared identifier

如果有人能指出我搞砸的地方,我将永远感激不已。非常感谢。

[1] https://stackoverflow.com/a/2298291/2903608

[2] https://stackoverflow.com/a/24899454/2903608

--------------------编辑--------------------

我已经修改了我的问题,并且我添加了这个来回复这个 skyking 的回复。这非常好,但我想我只是在最后的障碍上失败了。

我有一个头文件 (class1.h),其中包含“class A”,如他的回复所示:

#ifndef CLASS1_H
#define CLASS1_H

#include <QCoreApplication>

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

及其关联的(class1.cpp)包含其唯一方法:

#include "class1.h"

void do_something(int value, A* obj, void (A::*cb)(int)) {
(obj->*cb)(value);
}

在我的文件(主要是.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();
}

因此,当我执行初始步骤时,调用 do_something(..) 效果很好。但是最后一步失败了。请注意,为了避免名称混淆,我已将 skyking 的最后两个要调用的 do_something() 定义重命名为 do_anotherthing()。 但是,我遇到以下错误不知道怎么整理:

main.cpp(15) : error C2039: 'function' : is not a member of 'std'
main.cpp(15) : error C2061: syntax error : identifier 'function'
main.cpp(16) : error C3861: 'cb': identifier not found

main.cpp(24) : error C3867: 'A::callback': function call missing argument list; use '&A::callback' to create a pointer to member
main.cpp(24) : error C2660: 'do_anotherthing' : function does not take 2 arguments

最后,我想花点时间对我需要在 SO 上发布问题时的知识和回复速度表示由衷的感谢。非常感谢大家。

最佳答案

我认为有人会质疑您完全理解答案的说法。

为了理解它,我认为您可能应该从问题的右端开始,去除所有分散核心问题注意力的华而不实的东西。让我们从一个普通的 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_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);
}

然而,这有一个问题,即您将自己限制为使用 A 类的方法作为回调 - 您不能再使用普通函数作为回调。这里 std::function 来拯救,因为它使用了一个包装器,可以将任何类型的可调用对象包装在一个对象中

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

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

关于c++ - 在 C++ 中实现回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33345443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com