我知道建議不要在建構式中拋出例外,但是我需要在建構式中使用switch 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: {
//在呼叫Length(1, LengthUnit(10))時訪問,不允許。
//拋出std::exception();。
}
}
private:
int mNanometers;
};
- noexcept標記為constrcutor不應該拋出一個例外 。
uj5u.com熱心網友回復:
你的知識是不正確的。通常建議在構造失敗時從建構式拋出一個例外。捕捉例外通常是最方便的,但不一定。方便往往不是我們使用 C 的原因。
因此,如果你不想從構造器中拋出,那么你應該對錯誤構造的物件設定某種 "壞"、"不存在 "或 "錯誤構造 "的狀態(并在物件中存盤這些狀態),同時以if (length.isBad())的方式明確處理這些狀態,而不是通過捕獲例外。這通常是不被推薦的。
uj5u.com熱心網友回復:
如果你在建構式中拋出例外,那么解構式將不會被自動執行。如果你在建構式中手動獲取資源,并且必須在解構式中手動釋放,這就是一個問題。但是如果你在類中有自動物件,負責獲取/釋放資源,那么在建構式中拋出例外就不是問題。自動成員的析構器將被呼叫。如果你需要手動獲取資源,請建立獨立的類來自動管理資源,并在你的類中使用它。 一個好主意,這已經在評論中被建議了,使用列舉類,它將在編譯時保護你的代碼:
enum class LengthUnit : int
{
MILLIMETERS = 0,
MICROMETERS,
NANOMETERS,
};
另一種選擇,如果你仍然需要不從建構式中拋出,仍然有一種方法來表明物件的無效狀態。使用一個成員變數。但是你的類并不存在從建構式拋出例外的問題。如果你使用enum class,使用狀態變數也是多余的:
class Length
{
public:
Length(double value, LengthUnit unit) noexcept
{
switch(unit)
{
case LengthUnit::MILLIMETERS: mNanometers = value * 1e6; break;
case LengthUnit::MICROMETERS: mNanometers = value * 1e3; break;
case LengthUnit::NANOMETERS: mNanometers = value; break;
default:
valid = false;
}
}
bool isValid(){return valid;}
bool isInvalid(){return !valid;}。
private:
bool valid = true;
int mNanometers = 0;
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/320031.html
標籤:
上一篇:為什么錯誤處理在rep中不起作用,而在VSCode中起作用?discord.py
下一篇:IOB藍牙通過沙盒訪問被阻止
