Ver Mensaje Individual
  #2 (permalink)  
Antiguo 10/04/2015, 00:05
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Tengo una duda con los punteros en los atributos

Un puntero es un tipo de variable que tiene la capacidad de acceder a posiciones aleatorias de la memoria o, dicho de otra forma, de referenciar otras variables.

Para poder realizar asignaciones correctamente es necesario que el tipo de la variable que está a la derecha de la igualdad sea compatible con el tipo de la variable que está a la izquierda. Unos ejemplos:
Código C:
Ver original
  1. int a, b;
  2. a = b; // Ok
  3.  
  4. int c;
  5. char d;
  6. c = d; // Ok, son de diferente tipo pero la conversión directa es posible
  7.  
  8. char* e, f:
  9. e = f; // Ok
  10.  
  11. char* g;
  12. char h;
  13.  
  14. g = &h; // Ok, con el '&' estamos obteniendo la dirección de memoria de h
  15. g = h; // Error, 'g' es un puntero y 'h' no.

En tu caso, las asignaciones que haces de 'id' y 'mes' son incorrectas porque el constructor recibe los parámetros por valor y tu estás intentando asignar un valor a un puntero... cuando un puntero únicamente espera recibir direcciones de memoria.

Un puntero en una clase, como norma general tiene sentido si:
  • El valor o el objeto almacenado se va a compartir entre varios elementos (y te interesa, por cuestion de memoria o porque necesitas que todos accedan al mismo valor, usar un puntero en vez de una copia del objeto)
  • El tipo de la variable representa un objeto ciertamente pesado (que ocupa bastante memoria)
  • Cuando tengas que usar listas de elementos de tamaño indeterminado y no puedas usar los contenedores propios de C++
  • Para reducir los tiempos de compilación al reducir las dependencias en los archivos de cabecera:
    • Cada vez que cambia un archivo de cabecera se tienen que recompilar todo el código que referencie directa o indirectamente a dicha cabecera.
    • Cada include obliga al compilador a cargar el archivo que se indica y esto pasa en cascada (los includes que están dentro de los includes también hay que cargarlos). Mover todos los includes posibles a los cpp mejora los tiempos de compilación.

Yo te recomendaría que SIEMPRE empezases por definir los miembros sin usar punteros. Si resulta que alguno de esos miembros necesita ser un puntero te darás cuenta porque te resultará imposible o complicado realizar determinadas tareas. Cuando adquieras más experiencia irás viendo las ventajas e inconvenientes de tener los miembros por valor o con punteros.

PD.: Una clase abstracta es aquella que no se puede construir por tener algúna función o método declarada como virtual pura. En este caso no vas a ser capaz de crear un elemento de esta clase ya que "está incompleta". En tu caso nada te impide crear elementos de tipo "Animal", no tienes ningún método definido como virtual puro, por lo que tu clase no va a ser, en ningún caso, abstracta.

Un saludo.