具有瞬态资源的RAII类

RAII classes with transient resources

本文关键字:RAII 资源      更新时间:2023-10-16

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

考虑一个管理和接口瞬态资源的类:TCP套接字连接、到蓝牙设备的连接以及与所述设备的通信。诸如此类的事情。如果资源不可用或变得不可用,我们可以假设类是完全无用的。

我无法决定RAII(具体地说,获取/连接到ctor中的资源(对于这种类型的类是好是坏。

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

我发现了一些围绕这个问题的其他话题,但还没有完全满足我的好奇心:RAII、Berkeley套接字和STL容器

可使无效的资源的RAII

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

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

如果一个资源可以具有"空"状态,那么拥有该资源的类拥有默认构造函数(以及acquirerelease方法(是完全合理的。

所有必须检查非空的成员都表明类不能有效地具有"空"状态,它不应该是DefaultConstructable,并且只有当它是可复制时才应该是可移动

通常情况下,有一个构造函数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
}