Ver Mensaje Individual
  #8 (permalink)  
Antiguo 24/08/2015, 05:21
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 2 meses
Puntos: 204
Respuesta: ¿Por qué no es obligatorio implementar una función privada?

Cita:
Iniciado por vangodp Ver Mensaje
Es que si la llamamos después de declararla como private nos merecemos un palo en el cuero jaja.
Si lo haces el compilador te avisará de que estás intentando llamar a una función privada ;)

Cita:
Iniciado por vangodp Ver Mensaje
¿Por que dices "...'se aprovechaba' hasta la llegada de C++11"?¿Es que tiene c++11 otro mecanismo e no podemos declarar como privado los constructores?
C++11 incorpora al lenguaje, entre otras cosas, dos palabras reservadas: default y deleted:

  • default obliga a que el compilador implemente la función por defecto.
  • deleted marca la función como borrada, lo cual impide que el compilador pueda crear una versión por defecto.


En qué afecta esto?


Veamos:
Código C++:
Ver original
  1. class Test
  2. {
  3.   public:
  4.     Test( ) = deleted;
  5.  };
  6.  
  7.  
  8.  
  9. int main( )
  10. {
  11.   Test test; // Error de compilación... el constructor por defecto no es accesible
  12.  
  13. }

Esto no se podía hacer en las versiones anteriores de C++, entonces el truco para deshabilitar un constructor que no se usaba era marcarlo como private y olvidarse de su implementación... si nadie lo llama el código funciona.

¿Hay alguna diferencia adicional entre un método y otro? SI y es que "deleted" le indica al compilador que no debe crear la función por defecto. Digamos que en con el truco usado en versiones anteriores a C++11 el compilador podía acabar creando código que nunca se usaba.

Por cierto, deleted se puede usar con cualquier función... esto puedes usarlo para deshabilitar funciones en clases hijas (en vez de marcarlas como privadas).

¿Y qué pasa con default? Bueno, como sabrás, si tu implementas un constructor hay otros constructores que, implicamente, no se van a implementar, por lo que si necesitas hacer uso de los mismos te toca poner a tí el código... con esta palabra clave obligas al compilador a crear el código para dicho constructor. Además, también puede ser utilizado para remarcar que dicho constructor está disponible:

Código C++:
Ver original
  1. class Test
  2. {
  3.   public:
  4.     Test() = default; // No hace falta implementación y queda claro que este constructor está disponible en esta clase
  5. };

Cita:
Iniciado por vangodp Ver Mensaje
En el vídeo, el locutor intenta dar motivos para que no usemos nunca ese tal Patrón Singletón, pero la verdad en algunos casos sí que le he visto algo de utilidad, sobre todo a la hora de pasar "punterillos" a si mismo con el tal miembro "instance()" que es el que se encarga de llamar al constructor privado evitando así crear más de una instancia de la clase. >_<
El patrón singleton es un tanto polémico. Debido a su extrema facilidad de uso es un azucarillo muy recurrido... a costa de la usabilidad del programa. Lo que incluyas en un singleton no tendrá dependencias dentro del código... cualquiera puede modificar su contenido, no hay trazas, no hay control de acceso. Si tienes un singleton no tienes forma de evitar que otro programador haga uso de sus funciones aún cuando no debiera.

Hay situaciones en las que puede ser necesario tener un singleton, pero merece la misma consideración que las variables globales... hay que intentar evitarlas. Para este punto no puedo darte soluciones genéricas, cada proyecto tiene sus particularidades y habría que dar más bien soluciones concretas a problemas concretos.

Un saludo