Y mas dudas de C++

Hola de nuevo , ya me asaltan las dudas otra vez en C++ , a ver si me podeis ayudar. Tengo dos clases en C++ una se llama Paciente y la otra fecha. Las dos estan relacionadas medianta composicion. En el diagrama UML me sale el signo de composicion ( el rombo negro ) en Paciente y en la parte de Fecha me sale un 1.

Segun he llegado a entender , tengo que crear un puntero llamado fechaNacimiento dentro de la declaracion privada de Paciente
Dentro del constructor de Paciente tengo que hacer algo con el objeto de la clase fecha?
El parametro del constructor del tipo Fecha se le pasa desde el main?

Gracias de antemano

El diagrama UML
Imagen
Segun he llegado a entender , tengo que crear un puntero llamado fechaNacimiento dentro de la declaracion privada de Paciente

Si.
Dentro del constructor de Paciente tengo que hacer algo con el objeto de la clase fecha?
El parametro del constructor del tipo Fecha se le pasa desde el main?

Por supuesto, crear e inicializar tu objecto fechaNacimiento, te lo dicen en el UML (el ultimo parametro de la clase Paciente lleva un objeto fecha para inicializar fechaNacimiento. En otras palabras (bueno, codigo XD ) así es como lo veo:
Paciente.cpp
Paciente::Paciente( ......, ......, ......., const Fecha *fechaNacimiento) {
     ...........
     ...........
     this->fechaNacimiento = new Fecha(fechaNacimiento);
     ...........
     ...........
}


main.cpp
   Fecha *fecha = new Fecha();
   //inicializas tu objeto fecha
   Paciente *paciente = new Paciente(.....,.......,........,fecha);
   delete fecha;
Ehm... no.

El constructor de Paciente recibe una referencia a una Fecha, no un puntero.

- ferdy
Ferdy escribió:Ehm... no.

El constructor de Paciente recibe una referencia a una Fecha, no un puntero.

- ferdy


Tienes razon ferdy. ¿ Como sera la asignacion dentro del constructor para la fecha ?
Ferdy escribió:Ehm... no.

El constructor de Paciente recibe una referencia a una Fecha, no un puntero.

- ferdy


No creo que haya gran diferencia (excepto en casos como sobrecarga de operadores o si estas usando otra plataforma como .net donde el manejo de los punteros y las referencias en memoria es distinto). Todo depende del tipo de codigo a implementar. De todas formas pongo la diferencia para que quede mas compenetrado con el UML. (Cuidado con los segmentation fault XD)

- Paciente::Paciente( ......, ......, ......., const Fecha *fechaNacimiento) {
+ Paciente::Paciente( ......, ......, ......., const Fecha& fechaNacimiento) {
No creo que haya gran diferencia (excepto en casos como sobrecarga de operadores o si estas usando otra plataforma como .net donde el manejo de los punteros y las referencias en memoria es distinto). Todo depende del tipo de codigo a implementar.


Para nada, hay mucha diferencia. En C++, las referencias no tienen por qué implementarse con punteros.

Además, usar una referencia tiene connotaciones semánticas que no tienen los punteros. Nada que ver.

- ferdy
El problema que no entiendo es que a ti te pasan un objeto fecha cuando invocas . Ejemplo del main que nos han dado :
Paciente p1("12345", "Ana Enferma", 'M', Fecha(10,10, 1970));
Vale entonces en el constructor de la clase Paciente tengo que asignar esa Fecha al objeto de la clase Fecha que esta en la parte privada de Paciente no? Esa es mi duda como se haria esa asignacion? Mediante el constructor copia?
PD : Perdon por ser tan pesado la programacion me lleva de cabeza...
Ferdy escribió:Para nada, hay mucha diferencia. En C++, las referencias no tienen por qué implementarse con punteros.

Además, usar una referencia tiene connotaciones semánticas que no tienen los punteros. Nada que ver.

- ferdy

Es cierto, no tienen por que implementarse con punteros, pero eso no conlleva a que no puedan o se deban implementar de esa manera, todo va si necesitas esas connotaciones o no en el codigo. No veo razon para seguir con el tema, solo di el primer ejemplo usando un puntero porque queria dar una alternativa a la declaración que ya estaba en el UML como referencia.

Vale entonces en el constructor de la clase Paciente tengo que asignar esa Fecha al objeto de la clase Fecha que esta en la parte privada de Paciente no? Esa es mi duda como se haria esa asignacion? Mediante el constructor copia?

Si, puedes hacerlo utilizando el constructor copia. (Tambien puedes usar el operador de asignación que segun veo esta sobrecargado con esa intención, pero lo no veo muy necesario usarlo en el constructor). Saludos.
codestation escribió:
Ferdy escribió:Para nada, hay mucha diferencia. En C++, las referencias no tienen por qué implementarse con punteros.

Además, usar una referencia tiene connotaciones semánticas que no tienen los punteros. Nada que ver.

- ferdy

Es cierto, no tienen por que implementarse con punteros, pero eso no conlleva a que no puedan o se deban implementar de esa manera, todo va si necesitas esas connotaciones o no en el codigo. No veo razon para seguir con el tema, solo di el primer ejemplo usando un puntero porque queria dar una alternativa a la declaración que ya estaba en el UML como referencia.

Vale entonces en el constructor de la clase Paciente tengo que asignar esa Fecha al objeto de la clase Fecha que esta en la parte privada de Paciente no? Esa es mi duda como se haria esa asignacion? Mediante el constructor copia?

Si, puedes hacerlo utilizando el constructor copia. (Tambien puedes usar el operador de asignación que segun veo esta sobrecargado con esa intención, pero lo no veo muy necesario usarlo en el constructor). Saludos.


Muchas gracias :) a los dos
Es cierto, no tienen por que implementarse con punteros, pero eso no conlleva a que no puedan o se deban implementar de esa manera, todo va si necesitas esas connotaciones o no en el codigo.


Si la especificación requiere una referencia, requiere una referencia, no un puntero. Por poder, podrías usar un shared_ptr o un weak_ptr, o tu propia clase de puntero con contador de referencias, pero no es lo que dice la especificación que le han dado.

Mediante el constructor copia?


No, con el operador igual. Por razones obvias.

- ferdy
9 respuestas