84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
比如自己写了一个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++写代码很少设计到异常。