我試圖創建一個「大多不變」的類,它允許客戶端如果需要破壞不變量,但僅當它們在離開範圍之前修復它發生這種糟糕的事情。從守衛類析構函數拋出異常導致std :: terminate
以下是涉及的兩個類。這與範圍守衛相似。更多細節,評論和ideone的小測試。
class HCAccessor;
class HasConditions
{
// class "mostly-invariant"
// 7 < payload_ <42
int payload_;
bool valid() const
{
if (!(7 < payload_) || !(payload_ < 42))
return false;
else
return true;
}
public:
HasConditions(const int payload)
: payload_(payload)
{
if (!valid())
{
throw std::runtime_error("can't construct");
}
}
friend class HCAccessor;
};
class HCAccessor
{
HasConditions& hc_;
public:
HCAccessor(HasConditions& hc)
: hc_(hc)
{}
HCAccessor(HCAccessor& other)
: hc_(other.hc_)
{}
~HCAccessor()
{
if (!hc_.valid())
{
throw std::runtime_error("you broke it!");
}
}
void payload(const int newval)
{
hc_.payload_ = newval;
}
int payload() const
{
return hc_.payload_;
}
};
當「大多是不變的」被打破,然後固定的代碼似乎工作。當「大多不變」仍然被打破,~HCAccessor()
拋出,std::terminate
被調用,我不知道爲什麼。導致std::terminate
呼叫的異常的原因似乎都不合適。
http://en.cppreference.com/w/cpp/error/terminate
至於我可以告訴只有一個異常被拋出,然後立即std::terminate
被調用。
爲什麼會發生這種情況,我該如何解決?
不要[在析構函數中拋出異常](http://stackoverflow.com/questions/130117/throwing-exceptions-out-of-a-destructor)。 –
除了在析構函數中拋出異常是不好的,你實際上是在試圖捕獲異常嗎?你如何處理'HCAccessor'類的臨時對象?還是你在任何地方通過價值傳遞它? –