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