我对使用C ++编写可读且高效的代码有疑问。
我正在使用构造函数创建tcp连接的类,该构造函数将服务器IP和端口IP作为输入。我想避免在例如IP错误的情况下创建对象。
我的问题是:
是否最好在发生故障时引发异常或创建一个 包装器类,带有一个布尔值,用于检查内部对象是否为 创建正确并避免在失败的情况下调用任何函数?
答案 0 :(得分:3)
在输入无效的情况下将其扔到构造函数中是可以的,甚至由core guidelines推荐。
命名构造函数(即静态成员函数)是同等有效的方法,例如返回std::optional<YourType>
(然后需要C ++ 17)。显而易见,实例化可能会失败,并规避了异常的弊端。这是一个小例子。
#include <optional>
class Example {
public:
static std::optional<Example> validateAndCreate(...);
private:
/* Private ctor makes usage of the above function mandatory. */
Example(...);
};
创建方法的实现可能是
std::optional<Example> validateAndCreate(...)
{
/* Use e.g. some utility function for validation: */
if (isInputValid(/* Pass parameter. */))
return Example(/* Pass parameter. */);
else
return std::nullopt;
}
然后,客户端代码在其中构造如下对象:
if (const auto instance = Example::validateAndCreate())
/* Do stuff with the instance. */
;
else
std::cerr << "What now?\n";
我想这种方法更具有自我证明作用(ctor可能抛出的事实应该记录在某处),但也更冗长。