В моем методе в моем классе я проверяю, равно ли значение 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
для указателей, однако, мой объект не является указателем, есть ли способ для меня, чтобы установить его на ноль или что-то подобное?
Вы возвращаетесь 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
}
Ну, как говорится в ошибке, 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);
}
Немного соответствующее обсуждение это может быть полезно.