学习回调函数(详细并附上代码例子)

目录

1、理解回调函数的概念

2、学习回调函数的语法:

3、回调函数的实例


学习回调函数的关键是理解如何正确定义和使用回调函数。

1、理解回调函数的概念

 (1)回调函数是一种编程模式,用于在某个事件发生时执行特定的代码。它是将一个函数作为参数传递给另一个函数,并在需要的时候被调用。回调函数通常用于异步编程,用于处理事件处理、定时器、网络请求等操作。

(2)回调函数的概念是基于函数式编程的思想,它允许将代码作为数据传递和操作。通过使用回调函数,可以实现代码的灵活性和可重用性,将代码片段作为参数传递给其他函数,使得程序可以按照特定的逻辑顺序执行。

(3)回调函数通常在事件完成后被调用,它可以接收和处理事件的结果或错误信息。在事件处理完成后,回调函数可以执行额外的操作,例如更新UI、处理数据等。

(4)使用回调函数的好处是可以将程序的控制权交给调用者,并在适当的时候执行回调函数来处理结果。这样可以避免阻塞主线程或耗费过多的资源。

总之,回调函数是一种将代码作为参数传递给其他函数,并在特定事件发生后被调用的编程模式。它在异步编程中非常常见,用于处理事件处理、定时器、网络请求等操作。

2、学习回调函数的语法:

(1)定义回调函数的一种常见方式是使用函数指针。首先,需要定义一个函数指针类型,该类型与回调函数具有相同的参数和返回类型。然后,可以声明一个函数,该函数将作为回调函数被调用。

以下是一个示例:

// 定义回调函数的函数指针类型
typedef void (*CallbackFunction)(int);

// 回调函数
void myCallback(int value) {
    // 执行特定的操作
    std::cout << "Callback called with value: " << value << std::endl;
}

// 接受回调函数作为参数的函数
void doSomething(CallbackFunction callback) {
    // 执行一些操作
    int value = 10;
    // 调用回调函数
    callback(value);
}

int main() {
    // 将回调函数作为参数传递给其他函数
    doSomething(myCallback);

    return 0;
}

在上面的示例中,我们首先定义了一个名为CallbackFunction的函数指针类型,该类型接受一个int参数并返回void。然后,我们定义了一个名为myCallback的回调函数,该函数与CallbackFunction类型匹配。最后,我们定义了一个名为doSomething的函数,该函数接受一个CallbackFunction类型的参数,并在内部调用该回调函数。

main函数中,我们将myCallback函数作为参数传递给doSomething函数,以实现回调功能。当doSomething函数被调用时,它会调用传递的回调函数,并将一个值传递给它。

(2)除了使用函数指针,C++还支持使用函数对象(即重载了函数调用运算符operator()的类)作为回调函数的方式。

使用函数对象作为回调函数的示例代码如下:

// 回调函数的函数对象
struct MyCallback {
    void operator()(int value) {
        // 执行特定的操作
        std::cout << "Callback called with value: " << value << std::endl;
    }
};

// 接受回调函数作为参数的函数
template<typename Callback>
void doSomething(Callback callback) {
    // 执行一些操作
    int value = 10;
    // 调用回调函数
    callback(value);
}

int main() {
    // 将回调函数作为参数传递给其他函数
    doSomething(MyCallback());

    return 0;
}

在上面的示例中,我们定义了一个名为MyCallback的函数对象,它重载了函数调用运算符operator()。然后,我们定义了一个名为doSomething的函数模板,该函数接受一个类型为Callback的参数,并在内部调用该回调函数。

main函数中,我们将一个临时创建的MyCallback对象作为参数传递给doSomething函数,以实现回调功能。当doSomething函数被调用时,它会调用传递的函数对象,并将一个值传递给它。

总结:无论是使用函数指针还是函数对象,回调函数的定义和传递方式都可以根据需要进行调整,以满足具体的应用场景。

3、回调函数的实例

将实例一些代码摘下来:


// 回调函数,将websocket的结果抛给上层
typedef void(*recvWebSocketMsg)(void* pUser, const char* pszData, int nSize);


class WebSocketBase
{
public:
	WebSocketBase(void);
	virtual ~WebSocketBase(void);


	// 设置回调函数
	void setCallBack(recvWebSocketMsg pFunc, void* pUser)
	{
		if (nullptr != pFunc)
			m_pRecvWebSocketFunc = pFunc;

		if (nullptr != pUser)
			m_pUser = pUser;
	}


	// 接收消息:在想回调函数的时候直接执行这个回调函数
	bool recvMsgByCallBack(const char* pszData, int nSize)
	{
		if (nullptr == pszData || nullptr == m_pRecvWebSocketFunc)
			return false;

		m_pRecvWebSocketFunc(m_pUser, pszData, nSize);
		return true;
	}


private:
	void* m_pUser;												// 返回回调的对象
	recvWebSocketMsg m_pRecvWebSocketFunc;						// 回调
}

猜你喜欢

转载自blog.csdn.net/bigger_belief/article/details/131458593