gpt4 book ai didi

c++ - 声明后添加好友类

转载 作者:太空狗 更新时间:2023-10-29 21:06:09 25 4
gpt4 key购买 nike

我正在尝试用 C++ 编写命名管道服务器。我有一个名为 client_pool 的类,它包含管道实例的容器,以及一个公共(public)成员函数 write,它向所有连接的客户端异步发送数据。

问题是,客户端往往会意外断开连接。发生这种情况时,对 WriteFileEx 的调用将失败并返回 ERROR_NO_DATA。当发生这种情况时,我想转到 client_pool 类并告诉它关闭客户端句柄并将其从容器中删除。但是,由于 WriteFileEx 实在是太难用了,我在匿名命名空间中创建了一个名为 write_context 的辅助类。

所以最终的结果是,我想调用 client_pool 中的私有(private)方法,该方法在 clients.h 中声明,来自类 write_context,它在 clients.cpp 中声明。类似的东西(省略细节/错误处理):

clients.h

class client_pool {
struct implementation;
std::unique_ptr<implementation> pimpl;
public:
void write(uint8_t *data, size_t size);
};

客户端.cpp

struct client_pool::implementation {
set<HANDLE> connected;
// ...
void disconnect(HANDLE victim)
{
CloseHandle(victim);
connected.erase(victim);
}
};

namespace { struct write_context {
OVERLAPPED overlapped;
client_pool *owner;
HANDLE target;
const uint8_t *buffer;
size_t total_size;
size_t written;
// ...
void next_chunk()
{
if(!WriteFileEx(/* ... */, write_context::completion_routine)) {
if(GetLastError() == ERROR_NO_DATA) {
// I want to do something like
owner->pimpl->disconnect(target);
}
}
}
static void CALLBACK completion_routine(DWORD errcode, DWORD transferred, LPOVERLAPPED overlapped)
{
auto self = reinterpret_cast<write_context*>(overlapped);
self->written += transferred;
if(errcode == ERROR_MORE_DATA) {
self->next_chunk();
} else {
delete self;
}
}
}; }

void client_pool::write(uint8_t *data, size_t size)
{
for each handle in pimpl->connected {
auto context = new write_context(this, handle, data, size);
context->next_chunk();
}
}

显然,owner->pimpl->disconnect(target); 行无法编译,因为 pimpl 是私有(private)的。我能做什么/我有什么选择?

最佳答案

直接在您的 client_pool::write 方法中直接访问 pimpl->connected 和 write_context 与 pimpl 惯用法的要点有点相反。在遇到像这样的问题之前,您可能会提出其他情况。

我只想创建一个 implementation::write 方法,您可以为其传递参数和指向 client_pool 的指针。

关于c++ - 声明后添加好友类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8112808/

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