3

在我课堂上的方法中,我正在检查一个值是否为 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 或类似的东西?

4

2 回答 2

10

您正在返回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
} 
于 2013-07-17T23:11:28.453 回答
4

好吧,正如错误所述,nullptr不可转换为您的 type 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);
}

一些可能有帮助的相关讨论。

于 2013-07-17T23:12:08.723 回答