既然要使用面向对象的思想,那为什么不直接使用成员函数OnUvRead?

来源:15-7 mediasoup下channel创建的详细过程

GavinXu89

2022-05-22

UnixStreamSocket::UnixStreamSocket
{
	...
	err = uv_read_start(
			  reinterpret_cast<uv_stream_t*>(this->uvHandle),
			  static_cast<uv_alloc_cb>(onAlloc),
			  static_cast<uv_read_cb>(onRead));	// 为什么不直接使用OnUvRead?
}

// 这样写有什么好处?
inline static void onRead(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf)
{
	auto* socket = static_cast<UnixStreamSocket*>(handle->data);

	if (socket)
		socket->OnUvRead(nread, buf);
}

// 为与uv_read_cb的函数参数类型相匹配,uv_stream_t* handle是本问题添加的。
inline void UnixStreamSocket::OnUvRead(uv_stream_t* handle, ssize_t nread, const uv_buf_t* /*buf*/)
{
}
写回答

1回答

李超

2022-05-23

C++本来与C就是相互调用,这很常见,不能为了面向对象而面向对象;另外libuv 是C实现的,它的回调用需要一个C函数,这里只是一个C调用C++的小技巧。你可以去试试,直接把回调函数换成一个对象方法看是否可以编译通过

0
1
GavinXu89
非常感谢!
2022-05-23
共1条回复

百万级高并发WebRTC流媒体服务器设计与开发

备战5G音视频时代,抢先掌握服务端高级技能

2067 学习 · 375 问题

查看课程