2013-07-17 14 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可能會有所幫助。

相關問題