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