编写可能具有无效参数的构造函数的最佳方法

时间:2018-11-22 13:44:51

标签: c++ code-readability

我对使用C ++编写可读且高效的代码有疑问。

我正在使用构造函数创建tcp连接的类,该构造函数将服务器IP和端口IP作为输入。我想避免在例如IP错误的情况下创建对象。

我的问题是:

  

是否最好在发生故障时引发异常或创建一个   包装器类,带有一个布尔值,用于检查内部对象是否为   创建正确并避免在失败的情况下调用任何函数?

1 个答案:

答案 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可能抛出的事实应该记录在某处),但也更冗长。