我是 C++ 的新手(来自 C)。我从概念上理解 RAII 应该如何工作,但我无法在其中安装一个简单的套接字连接处理程序。
当前代码:
void accept_ev(event_handler::token &t, int listenfd)
{
int newfd = accept(listenfd, NULL, NULL);
if (newfd < 0)
throw api_server_accept_failed(*this, errno);
connections.insert(api_server_connection(newfd));
}
这显然是不安全的,因为 api_server_connection 构造函数可能会在将 fd 分配给其成员变量之前引发异常。
所以我的下一个想法是将接受移动到构造函数中。问题是我真的希望 api_server_connection 不知道 fd 的来源。例如,如果我想在将来支持 inetd,它也可以像 fd 0 一样传递到程序中。
那么我该怎么做。我应该为每种获取 fd 的方式使用不同的构造函数吗?我应该做子类吗?另一种选择可能是有一个 lambda 函数?
或者在这种情况下我应该抓住任何错误并关闭调用者中的 fd 吗?