2013-07-17 15 views
3

在我的课程中,我正在检查值是否为0以返回nullptr,但我似乎无法做到这一点。无法将nullptr返回给我的类C++

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

将返回类型设置为Complex * – madnut

+0

也许是因为您没有在此处返回指针。你想复杂*不复杂。 – Aleks

回答

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 
} 
+2

同意这种方法。你不必担心内存泄漏,也不需要增加内存。 – Aleks

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可能会有所帮助。

相关问题