如果不满足条件,我应该在成员函数中返回什么?
What should I return in a member function if a condition is not met?
例如:
class Foo{
int data;
// ...
}
有一个成员函数:
Foo func(int a){
if(a > 10) return Foo(a);
else {} // problem is here, I do not want return
any Foo object, do I throw exception? how?
}
所以,我不想在else块中返回一个新的空Foo
对象,我如何以习惯的方式处理这种情况?
如果前置条件对于函数的继续是绝对必要的,那么抛出异常是处理它的正确方法。如果在函数的其余部分不显式地要求条件,那么您有两个选项:
- 返回管理指针的唯一指针,即
std::unique_ptr
。我不推荐这种方法,因为它有不必要的动态内存分配。 - 返回
boost::optional<Foo>
或以后的TSstd::experimental::optional<Foo>
。这表达了该值可能存在也可能不存在的意图。 重新评估你的设计。为什么返回取决于条件?我们可以做些什么不同的事情?等。
是的,如果您发现在某些情况下,您的函数应该突然不返回值,那么要么:
- 抛出异常,或者
- 你的设计坏了
最好是返回一个指针:
Foo* func(int a){
if(a > 10) return new Foo(a);
else return 0; // else return plain zerro
}
c++ 11 Foo* func(int a){
if(a > 10) return new Foo(a);
else return nullptr;
}
当然你需要检查返回的对象是否存在于你的调用函数中:
Foo* ptr = func(5);
if(ptr)
{
// use ptr
*ptr;
}
else
{
// do not use it
}
// and delete it
if(ptr) delete ptr;
// in c++11 version no need to check just:
delete ptr;
对不起,我没有看到你不想返回0…
Foo* func(int a){
if(a > 10) return new Foo(a);
else throw(a);
}
try
{
Foo* get = func(4); // this will throw
}
catch(int)
{
//handle the error here
}
相关文章:
- 从函数返回const char*数组
- 检查函数返回类型是否与STL容器类型值相同
- 从 c 或 cpp 系列子函数返回到主函数
- 从函数返回任意简单类型的数据
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 从 C++ 中的函数返回数组地址问题
- VirtDisk.h QueryChangesVirtualDisk() 函数返回 RangeCount 为 0
- 为什么glGetSubroutineIndex为不同的函数返回相同的值?
- 在 c++ 中将函数返回类型指定为模板参数
- 从封装在对象中的函数 C++ 返回时为空的列表
- 为什么向量内部的指针在从函数返回时会发生变化?
- 函数返回的 rvalue 引用(表达式)是 xvalue - 但没有标识?
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- 寿命延长从函数返回引用
- 程序不向函数返回值
- 字符串函数返回奇怪的值
- 类的大问题,以及从空函数c++返回
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- C++二叉搜索树模板从函数返回节点
- NVCC 错误:string_view.h:constexpr 函数返回是非常量