之前拋出異常防止構造C++通過構造函數體
我想一個類來throw
其構造身體的大括號{
利用自己的成員函數,以防止施工前的異常。我所定義的成員函數,它的目的僅僅是無條件throw
異常,與任意選擇的非void
返回類型和一個僞數據成員,其類型返回類型相匹配,這樣我可以通過構建與該數據成員觸發throw
在構造函數初始化器列表中調用所述成員函數。這是有效的,但並不優雅,因爲在非玩具類中,虛擬變量不能用於其他目的,只能爲成員函數運行提供藉口,並且成員函數的非返回類型除了用於其他用途外,有一個藉口可以通過相同類型的虛擬數據成員的構造函數來調用它。
這個玩具編譯但不優雅:
class Toy
{
public:
Toy() : dummy(preventer()) {}
private:
int dummy;
int preventer() {throw -1; return 0;}
};
#include <iostream>
int main()
{
try
{
Toy t;
}
catch (const int& e)
{
std::cout << "caught the exception\n";
}
return 0;
}
控制檯輸出:
caught the exception
沒有虛擬變量,是有辦法的大括號之前拋出一個異常{
的構造函數體?
看到這個線程:http://stackoverflow.com/questions/2672398/throw-exception-from-constructor-initializer? – taocp 2013-03-28 02:23:30
@Ken White,我不是特別想創建一個單例。一般來說,我只想知道如何在構造函數的正文之前防止構造。 – CodeBricks 2013-03-28 02:25:16
明白了。 :-)我看到@SongWang發佈並刪除了我的評論的鏈接;一定發生了,就像你回答。 – 2013-03-28 02:26:30