Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Encapsulación de objetos

Estas en el tema de Encapsulación de objetos en el foro de C/C++ en Foros del Web. Hola a tod@s, tengo un problema y no sé resolverlo porque no entiendo bien el concepto. He implementado 3 clases. Una clase casilla, una clase ...
  #1 (permalink)  
Antiguo 22/06/2011, 04:57
 
Fecha de Ingreso: noviembre-2005
Ubicación: Alicante (España)
Mensajes: 242
Antigüedad: 18 años, 4 meses
Puntos: 1
Encapsulación de objetos

Hola a tod@s,

tengo un problema y no sé resolverlo porque no entiendo bien el concepto.

He implementado 3 clases.

Una clase casilla, una clase tablero y una clase partida.

class casilla {
private:
int x;
int y;
bool jugador;

public:
void putJugadorCasilla(bool j) { jugador=j;}
}


La clase casilla tiene una coordenada X, otra Y y un booleano que indica si tiene o no una ficha sobre ella.

La clase tablero tiene un atributo que es un array de casillas de 10x10.

class tablero {
private:
Casilla tablero_juego [10][10];
public:
Casilla getCasilla(int i, int j) { return tablero_juego[i][j]; }
}



La clase partida, tiene un objeto tablero en su interior entre otras cosas.

class partida {
Tablero tablero;
}


Mi duda es la siguiente. Desde el main yo me creo un objeto partida.

Partida partida;

Ahora quiero situar el Jugador en la posición 5,5.

Utilizo las funciones de cada clase:

partida.getTablero().getCasilla(5,5).putJugadorCas illa(true);

Y no me actualiza la casilla 5,5 con el jugador.

¿Por qué me pasa esto?
¿Qué no estoy encapsulando bien?

¿Es por el tema del paso por referencia?
Aquí recupero el tablero desde partida y obtengo la casilla a la que quiero asignarle el valor true al atributo jugador. Cuando uso esto:

partida.getTablero().getCasilla(5,5).getX()

me devuelve el valor 5 perfectamente pero cuando se trata de modificar la casilla del tablero no lo hace.

Luego compruebo si jugador de la casilla 5,5 está a true y está a false.

Esta es mi duda.

Un saludo.
  #2 (permalink)  
Antiguo 22/06/2011, 06:06
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 3 meses
Puntos: 89
Respuesta: Encapsulación de objetos

Veo que lo haces todo estático, sería mejor de forma dinámica, pero eso ya es otro tema

Supongo que has verificado que el método con el que compruebas el jugador de una casilla es correcto, ¿no? A ver si lo estás haciendo bien pero la comprobación mal :D

¿Como inicializas los valores X e Y de la clase casilla? Al hacer un getX te funciona, ¿Al hacer un getY también?

O se me está pasando algo (que puede ser) o no veo nada raro en lo que haces.
  #3 (permalink)  
Antiguo 22/06/2011, 10:09
 
Fecha de Ingreso: febrero-2008
Ubicación: Leon
Mensajes: 19
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: Encapsulación de objetos

La funcion getCasilla de la clase tablero debe regresar un puntero a un objeto Casilla; de otra forma estas regresando por valor la casilla
  #4 (permalink)  
Antiguo 22/06/2011, 13:41
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Encapsulación de objetos

como dijo maperdel al hacer return tablero_juego[i][j]; devuelves por vaclor a la casilla. Cuando la modificas no modificas la vieja casilla sino una copia.

Lo que deberias hacer es pasar por referencia a la casilla. Prueba agregando el operador &. Asi:

Casilla & getCasilla(int i, int j) { return tablero_juego[i][j]; }
  #5 (permalink)  
Antiguo 23/06/2011, 01:39
 
Fecha de Ingreso: noviembre-2005
Ubicación: Alicante (España)
Mensajes: 242
Antigüedad: 18 años, 4 meses
Puntos: 1
Respuesta: Encapsulación de objetos

Hola a todos y gracias por responder,

he probado lo que me decís pero sigue sin funcionarme.

Respondiendo a Hemish2000, yo inicializo las variables X e Y de cada casilla en el constructor del tablero. He comprobado que, si hago un getX de la casilla (7,7) me devuelve un 7. Es correcto.

He puesto el & en el getCasilla como me habéis dicho pero sigue sin modificar el tablero.

partida.getTablero().getCasilla(7,7).putJugadorCas illa(true);

Esta sentencia debería modificar la casilla 7,7 y asignar un 1 al booleano jugador de esa casilla. Pero cuando visualizo el tablero no me ha modificado nada.

Si introduzco un 77 en la X de la casilla 0,0, tampoco me modifica nada. Debo estar modificando una copia.

partida.getTablero().getCasilla(7,7).putX(99);
cout << "X vale en la casilla 7,7: " << partida.getTablero().getCasilla(7,7).getX();


Este cout me devuelve que la x vale 7, y ése es el valor que tiene esa casilla cuando creo el tablero, pero si yo le digo que me ponga un 99. ¿Por qué no lo modifica?

He puesto en la cabecera del método un &

Casilla & Tablero::getCasilla(int i, int j) {
return tablero_juego[i][j];
}


¿Qué me falta?
  #6 (permalink)  
Antiguo 23/06/2011, 02:06
 
Fecha de Ingreso: noviembre-2005
Ubicación: Alicante (España)
Mensajes: 242
Antigüedad: 18 años, 4 meses
Puntos: 1
Respuesta: Encapsulación de objetos

SOLUCIONADO!!

Además del & al devolver la casilla, también necesitaba poner un & al devolver el tablero o hacía una moficiación de una copia!!!


Tablero & Partida::getTablero()

Muchísimas gracias a todos!!
  #7 (permalink)  
Antiguo 23/06/2011, 16:16
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Encapsulación de objetos

Justamente eso te iba a decir...pero como antes no habias mensionado el metodo GetCasilla se me paso por alto.

Etiquetas: objetos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:56.