ホームページ  >  に質問  >  本文

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

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

迷茫迷茫2714日前573

全員に返信(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
  • キャンセル返事