Ya no necesitas investigar más por todo internet porque estás al lugar necesario, poseemos la solución que deseas sin liarte.
Solución:
Hay varias formas bastante estándar de hacer esto. Hay diferentes ventajas y desventajas para los métodos, que no voy a tratar aquí.
Método 1: lanzar una excepción en caso de falla.
Normal Sphere::hit(Ray ray)
//stuff is done here
if(something happens)
throw InvalidIntersection;
//other stuff
return Normal(something, somethingElse);
void example(Ray r)
try
Normal n = s.hit(r);
... SUCCESS CASE ...
catch( InvalidIntersection& )
... FAILURE CASE ...
El método 2 devuelve un puntero a un objeto recién asignado. (También puede usar punteros inteligentes o auto_ptrs para hacer esto un poco más ordenado).
Normal* Sphere::hit(Ray ray)
//stuff is done here
if(something happens)
return NULL
//other stuff
return new Normal(something, somethingElse);
void example(Ray ray)
Normal * n = s.hit(ray);
if(!n)
... FAILURE CASE ...
else
... SUCCESS CASE ...
delete n;
El método 3 consiste en actualizar un objeto existente. (Podría pasar una referencia, pero una convención que uso es que cualquier parámetro de salida se pasa por puntero).
bool Sphere::hit(Ray ray, Normal* n)
//stuff is done here
if(something happens)
return false
//other stuff
if(n) *n = Normal(something, somethingElse);
return true;
void example(Ray ray)
Normal n;
if( s.hit(ray, &n) )
... SUCCESS CASE ...
else
... FAILURE CASE ...
Método 4: Devolver un optional
(usando impulso o similar)
optional Sphere::hit(Ray ray)
//stuff is done here
if(something happens)
return optional();
//other stuff
return optional(Normal(something, somethingElse));
void example(Ray ray)
optional n = s.hit(ray);
if( n )
... SUCCESS CASE (use *n)...
else
... FAILURE CASE ...
Creo que necesitas algo como
Normal* Sphere::hit(Ray ray)
//stuff is done here
if(something happens)
return NULL;
//other stuff
return new Normal(something, somethingElse);
para poder devolver NULL;
Si usa las bibliotecas de Boost, puede usar boost::opcional. Eso te da algo que está bastante cerca de un null valor:
boost::optional Sphere::hit(Ray ray)
//stuff is done here
if(something happens)
return boost::none;
//other stuff
return Normal(something, somethingElse);
impulso::opcional< T> es una clase contenedora que contiene una instancia de T o boost::none (una instancia de boost::none_t).
Consulte http://www.boost.org/doc/libs/1_47_0/libs/opcional/doc/html/index.html para obtener más detalles.
Nos puedes proteger nuestra faena exponiendo un comentario o valorándolo te estamos agradecidos.