【发布时间】:2018-11-04 20:25:23
【问题描述】:
我对许多现代 C++/OOP 概念还很陌生,我有一个关于 RAII 设计的问题。
考虑一个管理和接口瞬态资源的类:TCP 套接字连接、到蓝牙设备的连接以及与所述设备的通信。诸如此类的事情。如果资源不可用或变得不可用,我们可以假设该类完全无用。
我无法确定 RAII(具体而言,获取/连接到 ctor 中的资源)对于此类类是好还是坏。
一方面,如果类功能依赖于资源,那么从 ctor 抛出而不是稍后调用 Connect() 似乎是有意义的。另一方面,获取瞬态资源通常涉及一些阻塞和/或异步操作,这对我来说是糟糕的构造函数设计。
我发现了一些围绕这个问题的其他主题,但还没有完全满足我的好奇心: RAII, Berkeley Sockets, and STL Containers
RAII for resources that can be invalidated
我们将不胜感激任何关于最佳实践的指导!
编辑:根据下面的 cmets 澄清我的问题。 RAII 中处理建立所有类不变量的构造函数的部分——设备连接是一个不变量,因为类应该保证所有试图与该设备通信的公共方法在构造后都是有效的。但是——由于程序无法控制远程设备的可用性,这实际上可以被认为是类不变量吗?
【问题讨论】:
-
我对 C++ 中 RAII 的理解是它不应该强迫你在构造函数中获取资源。 AFAIK,没有
std::类要求。您可以拥有一个“空”向量、线程、文件流、智能指针等(通常是特定类的默认构造实例)。 RAII 更多的是关于在析构函数中自动释放资源。请注意,即使那样,资源通常也可以在某些成员函数(例如,std::fstream::close)销毁之前手动释放。这可以让您更好地控制错误,因为抛出析构函数是邪恶的。 -
RAII 是一个指南。当它有意义时,完全接受它。如果没有,请保留其范围绑定的资源管理部分。
-
感谢两位的意见! Daniel——我认为 RAII 的一个组成部分是在构造函数中建立和初始化类不变量。我想我的问题是“可以将瞬态资源视为类不变量吗?”再加上“在 ctor evil 中是否存在阻塞连接?”