這個問題在這里已經有了答案: try and catch 中的物件宣告未在范圍內定義 1 個答案 如何訪問在 try 陳述句中初始化的物件 2 個答案 在 try-catch 塊之外訪問變數 3 個答案 9 小時前關閉。
假設我在 try 塊內創建了一個物件,因為我想捕獲從它的建構式拋出的例外,我將如何在該塊之外使用該物件?
//Inputs given to t5 can throw an exception from the constructor.
try {
Time t5(23, 59, 59);
}
catch (invalid_argument& e) {
cerr << "\n\nException while initializing t5: " << e.what() << endl;
}
在引發例外的情況下,我可能不需要使用它,但在不引發例外的情況下,我以后肯定會需要它,但在塊內創建的物件無法在外部訪問。我能想到的一種解決方案是在塊之外創建物件,然后為它分配一個 R 值物件,我通過像這樣顯式呼叫建構式來創建:
Time t5;
try {
t5 = Time(23, 59, 59);
}
catch (invalid_argument& e) {
cerr << "\n\nException while initializing t5: " << e.what() << endl;
}
但這是在做一些不必要的事情,比如創建另一個物件只是為了捕捉例外。有沒有更好的方法來做到這一點?另外,從建構式中拋出例外是一種不好的編程習慣嗎?PS:我看到有人問了一個類似的問題,但是對于 C#,并且那里給出的解決方案與我想出的相同,但我相信應該有更好的方法,正如我上面解釋的那樣。謝謝你。
uj5u.com熱心網友回復:
取決于默認建構式的型別Time
。如果它的建構式只是將三個數字歸零,那么您的解決方案就可以了。
如果它的默認建構式很昂貴(或根本不存在),您可以將其放入std::optional
:
std::optional<Time> t5;
try
{
t5.emplace(23, 59, 59);
}
// ...
uj5u.com熱心網友回復:
不要以為我們真的可以在 try 塊之外訪問它。
解決問題的兩種方法。
最好是在 try 塊中包含 Time t5 的使用。
使用 std::optional
std::optional<Time> t5;
try
{
t5.emplace(23, 59, 59);
}
catch (invalid_argument& e) {
//exception message
}
if(t5)
{
//use t5
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/463349.html
上一篇:為什么我的物件渲染函式顯示無?
下一篇:如何在oop中使用字典來存盤資料