gpt4 book ai didi

c++ - 构造函数中的错误控制

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:49:46 24 4
gpt4 key购买 nike

有这样一个类:

class Circle{
int x;
int y;
int radius;
public:
Circle(int x_, int y_, int radius_){
x = x_;
y = y_;
if(radius < 0)
signal error;
radius = radius_;
}
};

无法创建半径小于零的圆。在构造函数中发出错误信号的好方法是什么?我知道有异常(exception),但还有其他方法吗?

最佳答案

一个好的方法就是不让错误编译!

不幸的是,仅使用 unsigned不会阻止将负值传递给构造函数——它只会被隐式转换为 unsigned 值,从而隐藏错误(正如 Alf 在评论中指出的那样)。

“正确”的解决方案是编写一个自定义的nonnegative(或者更一般地说,constrained_value)类型来编译器捕捉到这个error——但对于某些项目来说,这可能会导致过多的开销,因为它很容易导致类型的激增。由于它提高了(编译时)类型安全性,我仍然认为这从根本上说是正确的方法。

这种受限类型的简单实现如下所示:

struct nonnegative {
nonnegative() = default;
template <typename T,
typename = typename std::enable_if<std::is_unsigned<T>::value>::type>
nonnegative(T value) : value{value} {}

operator unsigned () const { return value; }

private:
unsigned value;
};

See it in action

这会阻止除无符号类型之外的任何构造。换句话说,它只是禁用从 signedunsigned 数字的通常隐式、有损转换。

如果在编译时无法捕获错误(因为值是从用户那里接收到的),在大多数情况下,诸如异常之类的东西是下一个最佳解决方案(尽管另一种方法是使用选项类型或类似的东西)。

通常您会将这种异常抛出封装在某种ASSERT 宏中。在任何情况下,用户输入验证不应该发生在类的构造函数中,而是在从外部世界读取值之后立即发生。在 C++ 中,最常见的策略是依赖格式化输入:

unsigned value;
if (! (std::cin >> value))
// handle user input error, e.g. throw an exception.

关于c++ - 构造函数中的错误控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6858546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com