比如自己写了一个User类,有一个函数是查找User并返回查找到的User类,但如果这个函数查找不到应该怎么处理,java可以返回null,但是cpp不能进行这样的类型转换。
ringa_lee2017-04-17 13:33:07
如果函數傳回值是指針,可以傳回nullptr
。
如果函數返回值是引用,則可以在查找函數內產生一個static
對象,然後凡是查找不到就返回這個對象的引用。
class User;
class UserList;
User &find(UserList &ul) {
static const User user;
// ...
return user;
}
通常,對於這種情況不會採用上述兩種辦法,因為往往在設計UserList
類別的時候會設計對應的迭代器(iterator),這樣函數的回傳值就是迭代器。而迭代器是存在指向 one-past-last 元素的,即查找不到的情況。例如對於vector
類:
vector<int> vi;
vi.end(); // one-past-last iterator
而對應的查找函數為:
vector<int>::iterator find(vector<int> &vi);
auto it = find(vi);
if (it != vi.end()) {
/* ... */
}
天蓬老师2017-04-17 13:33:07
我也提兩個方法
1、拋異常
User& find( ... )
{
...
if (not found) {
UserNotFoundException().throw(); //在函数调用外部try.catch,跟java类似
}
}
2、多回傳值
可以使用make_tuple,make_pair之類的函數建立回傳值
std::pair<User, bool> find( ... )
{
...
if (found) {
return make_pair(..., true); //在外部检查返回值 !不过只能返回拷贝!
}
}
其實迭代器和指標是一個好的解決方案,異常也是一個不錯的解決方案,可以和傳回值一樣很從容的判斷結果,不過c++寫程式碼很少設計到例外。