【发布时间】:2021-10-29 22:32:57
【问题描述】:
我知道建议不要在构造函数中抛出异常,但我需要在构造函数中使用switch case,我想知道我应该如何处理default case,实际上不应该访问。
enum LengthUnit {
MILLIMETERS = 0,
MICROMETERS,
NANOMETERS,
};
class Length {
public:
constexpr Length(double value, LengthUnit unit) noexcept {
switch(unit) {
case MILLIMETERS: mNanometers = value * 1e6; break;
case MICROMETERS: mNanometers = value * 1e3; break;
case NANOMETERS: mNanometers = value; break;
default: {
// accessed when called Length(1, LengthUnit(10)), not permitted
// throw std::exception();
}
}
private:
int mNanometers;
};
- constexpr 用于加速编译时计算值
- noexcept 被标记为构造函数不应抛出异常
【问题讨论】:
-
谁告诉你“构造函数不建议抛出异常”?这是表示对象构造问题的唯一方法。
-
如果您想保证不会使用无效参数调用 ctor,您将派生三个类并使
Length::Length()受保护。如果您想防止“错字”,请使用enum class LengthUnit: int {...}。 -
@Yksisarvinen:对不起,我发现异常不应该在析构函数而不是构造函数中抛出,非常感谢!!!
-
如果对象的构造由于某种原因失败(例如,如果它不能确保对象的状态有效,则强烈建议在构造函数中抛出异常分配一个资源[内存、互斥体等],该资源对于对象运行至关重要,但资源分配失败等)。
-
虽然 (C++17),godbolt.org/z/4cahY9Grf,但有一种方法可以在没有开关的情况下创建构造函数。此外,我建议您将表示物理单位的值存储为 SI 标准(因此长度为米)。然后提供功能以提供纳米(如果您愿意)。或者用你使用的单位来真正命名你的班级
标签: c++ exception constructor switch-statement