在我班上的方法中,我正在检查值是否为0以返回nullptr
,但我似乎无法做到这一点。
Complex Complex::sqrt(const Complex& cmplx) {
if(cmplx._imag == 0)
return nullptr;
return Complex();
}
我得到的错误是:could not convert 'nullptr' from 'std::nullptr_t' to 'Complex'
我现在意识到,nullptr
用于指针,但是,我的对象不是指针,有没有办法将它设置为null或类似的东西?
答案 0 :(得分:9)
您正在返回Complex
,这不是指针。要返回nullptr
,您的返回类型应为Complex*
。
注意到您的编辑 - 这是您可以做的:
bool Complex::sqrt(const Complex& cmplx, Complex& out) {
if(cmplx._imag == 0)
{
// out won't be set here!
return false;
}
out = Complex(...); // set your out parameter here
return true;
}
这样称呼:
Complex resultOfSqrt;
if(sqrt(..., resultOfSqrt))
{
// resultOfSqrt is guaranteed to be set here
}
else
{
// resultOfSqrt wasn't set
}
答案 1 :(得分:4)
嗯,正如错误所述,nullptr
无法转换为您的类型Complex
。你可以做的是(a)返回一个Complex*
(或更好的智能指针),并测试nullptr
以查看该函数是否具有非平凡的结果或者(b)使用像Boost.Optional这样的库来设计你的函数,使它可能没有有效的对象返回。
事实上,Boost.Optional的文档甚至给出了double sqrt(double n)
函数的示例,该函数不应该为负n
定义,并且与您的示例类似。如果您可以使用Boost,那么示例就像
boost::optional<Complex> Complex::sqrt(const Complex& cmplx)
{
if (cmplx._imag == 0)
// Uninitialized value.
return boost::optional<Complex>();
// Or, do some computations.
return boost::optional<Complex>(some parameters here);
}
可能有用的一些related discussion。