2010-02-28 104 views
0

我在C++程序中返回一個函數string。在某些情況下,例如如果函數遇到錯誤,我想返回一個特殊的值,告訴調用者出了什麼問題。C++空字符串

我基本上可以只返回一個空字符串"",但該函數確實需要空字符串作爲正常返回值。

  • 我該如何做到這一點?
  • 如果函數成功運行並且包含實際返回值的字符串,我是否已經創建了一個特殊的數據結構,用於存放bool的函數?

回答

10

這聽起來像是一個例外的用例。

try { 
    std::string s = compute(); 
} catch(ComputeError &e) { 
    std::cerr << "gone wrong: " << e.what(); 
} 

如果你不想或者不能使用異常,你可以改變功能的接口

std::string result; 
if(!compute(result)) { 
    std::cerr << "Error happened!\n"; 
} 

雖然大多數時候,我見過的返回值被用於實際結果和錯誤指針傳遞

bool b; 
std::string s = compute(&b); 
if(!b) { 
    std::cerr << "Error happened!\n"; 
} 

這樣做,你可以對錯誤參數指針默認爲0和代碼,可以忽略錯誤(因爲它可能與生活的好處空字符串返回,例如,或者如果事先知道輸入是有效的),就不需要理會:

std::string compute(bool *ok = 0) { 
    // ... try to compute 

    // in case of errors... 
    if(ok) { 
    *ok = false; 
    return ""; 
    } 

    // if it goes fine 
    if(ok) { 
    *ok = true; 
    } 
    return ...; 
} 
+0

那是什麼'compute(&s)'?是否有任何理由,你沒有改變函數的接口「布爾計算(std :: string&s)'並放棄指針? – 2010-02-28 00:39:50

+0

你在速度+1上擊敗我:) – Klaim 2010-02-28 00:41:53

+0

@Chris,你是對的,我認爲讓它參考會更好。我會改變它 – 2010-02-28 00:46:19

3

你絕對可以返回一對,雖然是klunky。

pair< string, bool > my_method(...) { 
    if (a) { 
    return make_pair(some_value, true); 
    } else { 
    return make_pair("", false); // error 
    } 
} 

pair< string, bool > result = my_method(...); 
if (result.second) { 
    // success 
} else { 
    // error 
} 

您還可以通過其中的布爾或引用字符串,

bool my_method(string& s, ...) { 
    ... 
} 

string s; 
if (my_method(s, ...)) { 
    // success 
} else { 
    // error 
} 

或:

string my_method(bool& ok, ...) { 
    ok = false; // default 
    ... 
} 

bool ok; 
s = my_method(ok, ...)); 
if (ok) { 
    // success 
} else { 
    // error 
} 
2

你可以嘗試一個auto_ptr返回一個字符串,但是這將花費你是一個明確的新字符串。

std::auto_ptr<std::string> Foo(int i) 
{ 
    if(i == 0) // Error! 
     return std::auto_ptr<std::string>(NULL); 
    else // Works. 
     return std::auto_ptr<std::string>(new string("Hello world!")); 
} 
0

如果它真的像錯誤一樣,你應該拋出異常。但通過閱讀你的問題,我猜這不是一個「特殊行爲」?

如果是這樣的話,你有幾個不完美的解決方案:

  1. 返回與串並告知用戶,如果函數失敗的布爾結構(一個簡單的std ::對<>可夠)。
  2. 使你的函數修改引用提供的字符串參數並返回一個布爾值,告訴函數是否失敗。
  3. 使您的函數成爲具有狀態的函數/對象。該狀態至少是(至少)一個布爾值,表示最後一次函數調用失敗或成功 - 這將是一個函數調用。

3是IMO壞設計,而2和1是不完美的妥協。

0

這取決於你的程序是如何組織的。

您可能會返回一個額外的布爾值,表示函數是否成功。您可能會返回一個包含布爾值和字符串的結構。您可能會返回一個代表失敗的特殊字符串(不一定是空的)。你可能會拋出一個異常。你可以設置一個表示錯誤的全局標誌(雖然我不會推薦它)。

也必須有很多其他方法來表達功能故障。

0

std::pair<>方法很好。另一種方法是讓調用者將輸出字符串作爲非const引用傳入,並根據是否遇到錯誤使函數返回true或false。

bool Foo(int i, std::string& result) 
{ 
    bool ret = false; // no error 
    // do stuff... 
    result = "blahbalhbalh"; 
    return ret; 
}