gpt4 book ai didi

c++ - 回调函数 C++

转载 作者:行者123 更新时间:2023-11-28 02:55:24 24 4
gpt4 key购买 nike

我在尝试制作回调系统时遇到了很多问题。我想将一个函数传递给另一个类的函数来接收数据。

我希望 ExampleClass 调用 SeperateThread::operate,我希望 SeperateThread::operate 能够调用 ExampleClass::updateNumber(int) 返回一个值。我已经用各种函数指针等尝试了几个小时,但似乎无法让它工作。

SeperateThread 是另一个线程,因此它不会阻塞运行 ExampleClass 的主线程,但是当 SeperateThread 完成计算时,我需要将值返回给 ExampleClass

这是否有意义?这是我正在尝试做的事情的概述。在此示例中,我希望 SeperateThread::operate 调用 ExampleClass::updatenumber(15);...

class ExampleClass
{
public:
ExampleClass()
{
int numberToPass = 10;
// call SeperateThread::operate and pass value and updatenumber function as pointer
thread.operate(numberToPass, *updatenumber(int number));
}
~ExampleClass();

void updatenumber(int number)
{
// Do some stuff to the number passed to this function
}

private:
SeperateThread thread;
}



class SeperateThread
{
public:
SeperateThread();
~SeperateThread();

void operate(int number, &FunctionToCallBack)
{
// Do some calculations (result 5 for example purposes)
int result = numberToPass + 5;

// Call the callback function and pass result int
FunctionToCallBack(result);
}
}

最佳答案

这里有两个问题:

1。一个回调函数是不够的

您需要代码回调的地址,以及代码应该操作的对象的标识。惯用的 C++ 方法是将其封装在一个对象中:

class SeparateThread { 
public:
class Callback {
public:
virtual void ThreadDone(int result) const = 0;
virtual ~Callback() {}
};
void operate(int number, const Callback & callback)
{
// Calculate result
callback.ThreadDone(result);
}
};

ExampleClass 然后可以从 SeparateThread::Callback 私有(private)继承并实现 ThreadDone() 或定义一个单独的回调类:

class ExampleClassThreadCallback : public SeparateThread::Callback {
public:
ExampleClassThreadCallback(ExampleClass * obj) : fObj(obj) {}
void ThreadDone(int result) const override {
fObj.updatenumber(result);
private:
ExampleClass * fObj;
}
};

然后您只需将线程称为:

thread.operate(number, ExampleClassThreadCallback(this));

2。并发

在这样的设计中,您的类从单独的线程更新,您可能会遇到并发问题,因此您必须设计适当的机制以确保此更新不会导致问题。

关于c++ - 回调函数 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22132149/

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