首頁  >  問答  >  主體

设计模式 - c++自己编写的查找函数如果查找不到应该返回什么?

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

迷茫迷茫2714 天前571

全部回覆(2)我來回復

  • ringa_lee

    ringa_lee2017-04-17 13:33:07

    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()) {
        /* ... */
      } 

    回覆
    0
  • 天蓬老师

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

    回覆
    0
  • 取消回覆