具有瞬态资源的RAII类
RAII classes with transient resources
我对许多现代C++/OOP概念还很陌生,我有一个关于RAII设计的问题。
考虑一个管理和接口瞬态资源的类:TCP套接字连接、到蓝牙设备的连接以及与所述设备的通信。诸如此类的事情。如果资源不可用或变得不可用,我们可以假设类是完全无用的。
我无法决定RAII(具体地说,获取/连接到ctor中的资源(对于这种类型的类是好是坏。
一方面,如果类功能依赖于资源,那么从ctor而不是稍后的Connect((调用中抛出似乎是有意义的。另一方面,获取临时资源通常涉及一些阻塞和/或异步操作,这对我来说就像是糟糕的构造函数设计
我发现了一些围绕这个问题的其他话题,但还没有完全满足我的好奇心:RAII、Berkeley套接字和STL容器
可使无效的资源的RAII
任何关于最佳实践的指导都将不胜感激!
编辑:根据下面的评论澄清我的问题。对于RAII中处理构造函数建立所有类不变量的部分,设备连接是不变量,因为类应该保证所有试图与该设备通信的公共方法在构造后都是有效的。但是,由于程序无法控制远程设备的可用性,这实际上可以被视为类不变量吗?
如果一个资源可以具有"空"状态,那么拥有该资源的类拥有默认构造函数(以及acquire
和release
方法(是完全合理的。
所有必须检查非空的成员都表明类不能有效地具有"空"状态,它不应该是DefaultConstructable,并且只有当它是可复制时才应该是可移动。
通常情况下,也有一个构造函数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
}
相关文章:
- 具有瞬态资源的RAII类
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 允许从 std::map 的密钥窃取资源?
- 参考资源文件VC++中的$(SolutionDir)
- 如何维护资源管理器项目视图中当前可见的项目列表
- 将 std::allocate_shared 与多态资源分配器一起使用
- 使用RAII在给定次数的迭代后重新分配资源
- 资源管理设计模式
- 如何跨平台将二进制资源构建到程序中?
- SetDlgItemInt 不会更改嵌入资源的编辑框
- Klocwork Inside的资源泄漏
- 从存储为 Windows 资源 (c++) 的 png 中获取 png 文件数据
- 在文件夹迭代上实现 RAII
- C++链接时间资源"allocation"而不定义
- 如何处理 RAII 中的资源等待
- RAII 表示可能失效的资源
- 有关资源管理器类的 RAII 问题
- 如何利用RAII获取类资源
- 从RAII对象泄漏资源
- RAII资源处理