Не могу вернуть nullptr в мой класс С++

В моем методе в моем классе я проверяю, равно ли значение 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 или что-то подобное?


person hakuna matata    schedule 17.07.2013    source источник
comment
Установите тип возвращаемого значения «Сложный*».   -  person madnut    schedule 18.07.2013
comment
может быть, потому что вы не возвращаете указатель здесь. Вам нужен Комплекс*, а не Комплекс.   -  person Aleks    schedule 18.07.2013


Ответы (2)


Вы возвращаете 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
} 
person Vittorio Romeo    schedule 17.07.2013
comment
Согласен с этим методом. Вам не нужно беспокоиться об утечке памяти, и вам не нужно будет добавлять ускорение. - person Aleks; 18.07.2013

Ну, как говорится в ошибке, nullptr не конвертируется в ваш тип Complex. Что вы можете сделать, так это (а) вернуть Complex* (или, что еще лучше, интеллектуальный указатель) и проверить nullptr, чтобы увидеть, имеет ли функция нетривиальный результат, или, возможно, (б) использовать библиотеку, например 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);
}

Некоторые связанные обсуждение, которое может быть полезным.

person Community    schedule 17.07.2013