Saltar al contenido

Cómo devolver un objeto NULL en C++

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *