RAII 类 具有临时资源

RAII classes with transient resources

我对许多现代 C++/OOP 概念还很陌生,我有一个关于 RAII 设计的问题。

考虑一个 class 来管理和连接瞬态资源:TCP 套接字连接、与蓝牙设备的连接以及与所述设备的通信。像这样的事情。如果资源不可用,我们可以假设 class 完全没用。

我无法确定 RAII(具体来说,acquiring/connecting 到 ctor 中的资源)对于这种类型的 class 是好是坏。

一方面,如果 class 功能依赖于资源,那么从 ctor 中抛出而不是在稍后的 Connect() 调用中抛出似乎是有意义的。另一方面,获取临时资源通常涉及一些阻塞 and/or 异步操作,这对我来说感觉像是糟糕的构造函数设计。

我发现了一些围绕这个问题的其他主题,但没有完全满足我的好奇心: RAII, Berkeley Sockets, and STL Containers

任何关于最佳实践的指导将不胜感激!

编辑:根据以下评论澄清我的问题。 RAII 的部分处理建立所有 class 不变量的构造函数——设备连接是一个不变量,因为 class 应该保证所有尝试与该设备通信的 public 方法都是有效的施工后。但是 -- 这实际上可以被认为是 class 不变量,因为程序无法控制远程设备的可用性吗?

如果资源可以具有 "empty" 状态,那么拥有该资源的 class 拥有默认构造函数(以及 acquirerelease 方法是完全合理的).

所有必须检查非空的成员表示 class 不能 有用地具有 "empty" 状态,它不应该成为 DefaultConstructable, and should only be Moveable if it is Copyable.

通常你会有一个acquired的构造函数。

异步构造某些东西是可以的,尽管这将涉及将构造包装在异步函数中。

template <typename T, typename ... Args>
std::future<T> constructAsync(Args&& args...)
{
    return std::async([](Args&& args...) { return T(std::forward<Args>(args)...); }, std::forward<Args>(args)...);
}

int main()
{
    auto foo = constructAsync<Foo>();
    auto bar = constructAsync<Bar>("some", "params");

    foo.get().frob(bar.get()); // only occurs when both are ready
}