C++ Duda de clases

dagavi

Buenas, para la uni tengo que hacer un trabajo de programación modular y tengo una duda sobre como se comportaría las clases en cierto momento.

El problema es que antes debemos de hacer la especificación y la implementación.

Después de hacer la codificación a C++ de la implementación se podría variar, pero sería bastante trabajo cambiar eso si no funciona bien. Por eso realizo esta pregunta para saber si alguien me puede confirmar como se comportaría mi programa al hacer lo siguiente:

LA DUDA:
[Voy a poner otras clases, no las que tengo que usar, así no hará falta explicarlas]

Pongamos que tengo la clase Persona donde tiene algo (vector, pila, cola...) que guarda a sus hijos. Esta clase tiene una función "añadir hijo".

Después tengo una clase Grupo de personas (puede ser un vector de personas, por ejemplo) que es básicamente con la que trabajamos. Esta tiene una función que dado un nombre nos devuelve la persona con ese nombre.

En el programa principal llenamos el "Grupo de personas" de personas y ahora viene lo que me interesa.

Pongamos que ahora querémos añadir un hijo a una persona, como véis tenemos en Grupo de persona una función que busca dentro del vector a una persona y la retorna y las personas tienen la función "añadir hijo".

¿El "hijo que retorna" la función "Grupo de personas" sería una copia o como un puntero al hijo retornado?

Explico más mi duda, si hago ahora:

grupo.consultar("paco"); // Esto devuelve una persona del "Grupo de personas"

persona.añadir_hijo(TAL); // Añade el hijo TAL a persona

Si hago:

grupo.consultar("paco").añadir_hijo(TAL);

o bien (para separarlo un poco más):

Persona c = grupo.consultar("paco");
c.añadir_hijo(TAL);

¿Se modifica el hijo dentro del vector "Grupo de personas"? ¿O se modifica una copia que nos ha devuelto la función "consultar"* y que por lo tanto no tiene repercusión real sobre "Grupo de personas"? (lógicamente lo que quiero es que se actualice la persona que hay en el grupo)

*La función consultar puede ser algo del tipo:
for (int i = 0; i < N; ++i)
if (nombre_persona == vector.nombre) return vector

Soltrac

Esta duda la tuve yo en su día.

Solo se modificará si el objeto persona es un puntero q apunta a la direccion de memoria de la posición "i" del grupo de personas. Si lo creas normalmente, no se guardará.

Por eso mismo, en los lenguajes de programación q no tienes punteros no se guarda :)

cabron

En C++ lo puedes hacer como te de la gana, puedes hacer que se devuelva una copia, o puedes hacer que se devuelva el original, todo depende de lo que necesites.

En tu caso necesitas que se devuelva el original, y eso lo puedes hacer con referencias o punteros.

Usar uno u otro dependerá de como funcione tu aplicación; si utilizas el mismo objeto para guardar personas diferentes que vas recuperando en diferentes llamadas, usa punteros, sin embargo si guardas el resultado de la llamada a recuperar personas en objetos diferentes, usa referencias.

dagavi

Gracias, he intentado implementar esto que he puesto para verlo en accion ya que es rápido y efectivamente no se guarda nada.

Como no dejan usar punteros tendré que crear otra función auxiliar para realizar esa acción -.- una que en este ejemplo sería en la clase "Grupo" de añade a tal persona tal hijo, como esta es la que contiene el vector si que podrá modificar la info ya que podrá aplicar la operación sobre lo que realmente me interesa, manía que tienen de no dejarnos usar punteros xD

cabron

#4:

¿Y por qué no usas referencias?

dagavi

Porque no me lo han enseñado xD a no ser que te refieras a pasar valores por referencia, ej: swap(int& a, int&b), pero en el caso que necesito no veo la utilidad (o como usarlo mejor dicho) ya que mi función (lo voy a poner de nuevo con el ejemplo anterior):

consultar("tal");

Devuelve una Persona (no se como sería devolver una referencia) que después modifico en el main.

Igualmente si la referencia se pasar a través de un return no lo he dado y por lo tanto no puedo usarlo.

cabron

Con una referencia, la función: grupo.Consultar("pepe"); te devuelve directamente el objeto pepe.

Puede parecer lo mismo que un puntero, pero no lo es. El puntero te devuelve la dirección de memoria de pepe, y através de esa dirección accedes a pepe, mientras que la referencia te devuelve directamente a pepe, sin que conozcas su dirección de memoria.

De todas formas si no has dado aún las referencias pues entoncés tendrás que hacerlo de otra forma.

dagavi

He mirado a ver como es eso de pasar una referencia y es básicamente llamar la función con un:

Persona& ....

En vez de
Persona

He programado esto con el ejemplo que pongo y funciona a la perfección, preguntaré al profesor si se puede hacer ya que es lo que necesito (quedaría muy feo hacer un método intermedio que no hace más que de "puente" entre clases)

Gracias por la info!

Usuarios habituales

  • dagavi
  • cabron
  • Soltrac