我在C++程序中返回一個函數string
。在某些情況下,例如如果函數遇到錯誤,我想返回一個特殊的值,告訴調用者出了什麼問題。C++空字符串
我基本上可以只返回一個空字符串""
,但該函數確實需要空字符串作爲正常返回值。
- 我該如何做到這一點?
- 如果函數成功運行並且包含實際返回值的字符串,我是否已經創建了一個特殊的數據結構,用於存放bool的函數?
我在C++程序中返回一個函數string
。在某些情況下,例如如果函數遇到錯誤,我想返回一個特殊的值,告訴調用者出了什麼問題。C++空字符串
我基本上可以只返回一個空字符串""
,但該函數確實需要空字符串作爲正常返回值。
這聽起來像是一個例外的用例。
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 ...;
}
你絕對可以返回一對,雖然是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
}
你可以嘗試一個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!"));
}
如果它真的像錯誤一樣,你應該拋出異常。但通過閱讀你的問題,我猜這不是一個「特殊行爲」?
如果是這樣的話,你有幾個不完美的解決方案:
3是IMO壞設計,而2和1是不完美的妥協。
這取決於你的程序是如何組織的。
您可能會返回一個額外的布爾值,表示函數是否成功。您可能會返回一個包含布爾值和字符串的結構。您可能會返回一個代表失敗的特殊字符串(不一定是空的)。你可能會拋出一個異常。你可以設置一個表示錯誤的全局標誌(雖然我不會推薦它)。
也必須有很多其他方法來表達功能故障。
std::pair<>
方法很好。另一種方法是讓調用者將輸出字符串作爲非const引用傳入,並根據是否遇到錯誤使函數返回true或false。
bool Foo(int i, std::string& result)
{
bool ret = false; // no error
// do stuff...
result = "blahbalhbalh";
return ret;
}
那是什麼'compute(&s)'?是否有任何理由,你沒有改變函數的接口「布爾計算(std :: string&s)'並放棄指針? – 2010-02-28 00:39:50
你在速度+1上擊敗我:) – Klaim 2010-02-28 00:41:53
@Chris,你是對的,我認爲讓它參考會更好。我會改變它 – 2010-02-28 00:46:19