Я знаю, что это может быть дубликат: Возврат "NULL" объект, если результат поиска не найден
НО, что-то другое происходит с моим кодом, потому что звездочка не решает мою проблему, а именно:
Normal Sphere::hit(Ray ray) {
//stuff is done here
if(something happens) {
return NULL;
}
//other stuff
return Normal(something, somethingElse);
}
Но я получаю сообщение об ошибке в строке return NULL
: conversion from ‘int’ to non-scalar type ‘Normal’ requested
И еще одна ошибка и предупреждение, ссылающиеся на последнюю обратную линию: warning: taking address of temporary
и conversion from ‘Normal*’ to non-scalar type 'Normal' requested
Я понимаю, почему я получаю это предупреждение, но я не знаю, как это исправить. Как вернуть объект Normal
в последней строке, которая сохраняется после завершения функции и как я могу вернуть объект NULL
в первый раз? (Если у вас есть термин для этих типов возвратов, пожалуйста, дайте мне знать, чтобы я мог также прочитать об этом больше.)
Чтобы прояснить вопрос комментатора, я пробовал следующие вещи:
Я попытался сделать это: Normal *Sphere::hit(Ray ray)
в файле cpp и Normal *hit( Ray ray );
в файле заголовка, и я получаю эту ошибку: error: prototype for ‘Normal* Sphere::hit(Ray)’ does not match any in class 'Sphere'
Я также пробовал это: Normal Sphere::*hit(Ray ray)
в файле cpp и Normal *hit( Ray ray);
в файле заголовка, и я получаю эту ошибку для второго оператора return: cannot convert 'Normal*' to 'Normal Sphere::*' in return
Дальнейшие разъяснения: Я не спрашиваю, как работают указатели. (Это был не главный вопрос.) Мне интересно, как синтаксис относительно указателей в С++. Итак, учитывая указанную выше функцию, я понял, что должен указывать возвращаемый указатель, потому что у С++ нет нулевых объектов. Понял. НО, тогда возникает проблема: как должен выглядеть прототип функции? В файле cpp у меня есть то, что предложил Бала (это то, что я изначально, но изменил его из-за следующей ошибки):
Normal* Sphere::hit(Ray ray) {
//stuff is done here
if(something happens) {
return NULL;
}
//other stuff
return new Normal(something, somethingElse);
}
В файле заголовка у меня есть Normal *hit(Ray ray)
, но я все еще получаю это сообщение: prototype for 'Normal* Sphere::hit(Ray)' does not match any in class 'Sphere'
В этот момент мне непонятно, почему он не может найти этот прототип функции. Вот заголовочный файл:
class Sphere
{
public:
Sphere();
Vector3 center;
float radius;
Normal* hit(Ray ray);
};
Может ли кто-нибудь понять, почему он жалуется, что не существует подходящего прототипа для hit
в классе Sphere
? (Я мог бы переместить это на отдельный вопрос...)