既然要使用面向对象的思想,那为什么不直接使用成员函数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回答
-
C++本来与C就是相互调用,这很常见,不能为了面向对象而面向对象;另外libuv 是C实现的,它的回调用需要一个C函数,这里只是一个C调用C++的小技巧。你可以去试试,直接把回调函数换成一个对象方法看是否可以编译通过
012022-05-23
相似问题