具有瞬时资源的RAII类

时间:2018-11-04 20:25:24

标签: c++ oop c++11 raii

我对许多现代C ++ / OOP概念还很陌生,并且对RAII设计有疑问。

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

我无法确定RAII(具体而言,获取/连接ctor中的资源)对于这种类型的类是好是坏。

一方面,如果类功能取决于资源,那么从ctor抛出而不是在稍后的Connect()调用中似乎是有意义的。另一方面,获取瞬态资源通常涉及一些阻塞和/或异步操作,这对我而言似乎是不良的构造函数设计。

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

RAII for resources that can be invalidated

任何有关最佳做法的指导将不胜感激!

编辑:根据以下评论澄清我的问题。由于RAII中与构造函数有关的部分建立了所有类不变式,因此设备连接是不变的,因为该类应保证尝试与该设备通信的所有公共方法在构造后均有效。但是,由于程序无法控制远程设备的可用性,因此实际上可以将其视为类不变的吗?

1 个答案:

答案 0 :(得分:0)

如果资源可以具有“空”状态,则拥有该资源的类具有默认构造函数(以及acquirerelease方法)是完全合理的。

所有需要检查非空的成员都表明类不能有用地处于“空”状态,并且不应为DefaultConstructable,而应仅为Moveable(如果是Copyable

通常,您会拥有acquire d的构造函数。

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

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
}