设计模式 - c++自己编写的查找函数如果查找不到应该返回什么?
迷茫
迷茫 2017-04-17 13:31:07
0
2
635

比如自己写了一个User类,有一个函数是查找User并返回查找到的User类,但如果这个函数查找不到应该怎么处理,java可以返回null,但是cpp不能进行这样的类型转换。

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回覆(2)
左手右手慢动作
  1. 如果函數傳回值是指針,可以傳回nullptr

  2. 如果函數返回值是引用,則可以在查找函數內產生一個static對象,然後凡是查找不到就返回這個對象的引用。

    class User;
    class UserList;
    User &find(UserList &ul) {
      static const User user;
      // ...
    
      return user;
    }
    
  3. 通常,對於這種情況不會採用上述兩種辦法,因為往往在設計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()) {
      /* ... */
    } 
Peter_Zhu

我也提兩個方法

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++寫程式碼很少設計到例外。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板