比如自己写了一个User类,有一个函数是查找User并返回查找到的User类,但如果这个函数查找不到应该怎么处理,java可以返回null,但是cpp不能进行这样的类型转换。
业精于勤,荒于嬉;行成于思,毁于随。
如果函數傳回值是指針,可以傳回nullptr。
nullptr
如果函數返回值是引用,則可以在查找函數內產生一個static對象,然後凡是查找不到就返回這個對象的引用。
static
class User; class UserList; User &find(UserList &ul) { static const User user; // ... return user; }
通常,對於這種情況不會採用上述兩種辦法,因為往往在設計UserList類別的時候會設計對應的迭代器(iterator),這樣函數的回傳值就是迭代器。而迭代器是存在指向 one-past-last 元素的,即查找不到的情況。例如對於vector類:
UserList
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()) { /* ... */ }
我也提兩個方法
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++寫程式碼很少設計到例外。
如果函數傳回值是指針,可以傳回
nullptr
。如果函數返回值是引用,則可以在查找函數內產生一個
static
對象,然後凡是查找不到就返回這個對象的引用。通常,對於這種情況不會採用上述兩種辦法,因為往往在設計
UserList
類別的時候會設計對應的迭代器(iterator),這樣函數的回傳值就是迭代器。而迭代器是存在指向 one-past-last 元素的,即查找不到的情況。例如對於vector
類:而對應的查找函數為:
我也提兩個方法
1、拋異常
2、多回傳值
可以使用make_tuple,make_pair之類的函數建立回傳值
其實迭代器和指標是一個好的解決方案,異常也是一個不錯的解決方案,可以和傳回值一樣很從容的判斷結果,不過c++寫程式碼很少設計到例外。