null — не могу вернуть 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 для указателей, однако, мой объект не является указателем, есть ли способ для меня, чтобы установить его на ноль или что-то подобное?

3

Решение

Вы возвращаетесь 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
}
9

Другие решения

Ну, как говорится в ошибке, 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);
}

Немного соответствующее обсуждение это может быть полезно.

4

По вопросам рекламы [email protected]