elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ejecutar métodos de un objeto en otros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ejecutar métodos de un objeto en otros  (Leído 3,846 veces)
maurus

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Ejecutar métodos de un objeto en otros
« en: 27 Febrero 2023, 17:59 pm »

Hola compañeros, buenos días, tardes o noches.

estoy intentando construir un pequeño juego, y estoy en una disyuntiva.

yo tengo la clase mapa, que yo quiero que una misma instancia, se comparta entre todos los personajes, fundamentalmente para consultar si la coordenada donde quieren ir está disponible o no.

yo pensé en hacerlo así, con punteros, pero no sé si es la mejor forma.
les dejo el código que creé que al menos me funcionó, pero quizás hay alguna forma más recomendable de hacer lo mismo.

Código:
#include <iostream>
#include <stdlib.h>
using namespace std;

class Mapa
{
private:
int x, y;

public:
Mapa ();
int getX ();
int getY ();
};

Mapa::Mapa ()
{
x = 10;
y = 19;
}

int Mapa::getX ()
{
return x;
}

int Mapa::getY ()
{
return y;
}

class Persona
{
private:
Mapa * map;
int x, y;

public:
Persona (Mapa *);
void consultar();
};

Persona::Persona (Mapa*m)
{
map = m;
x = 9;
y = 18;
}

void Persona::consultar ()
{
cout << "el valor de x es: " << map->getX() << endl;
}

int main ()
{
Mapa map;
Mapa *mp = &map;

Persona p1 (mp);
p1.consultar ();

system ("pause");
return 0;
}

Muchas gracias por leer,

un saludo.


En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.357


Ver Perfil
Re: Ejecutar métodos de un objeto en otros
« Respuesta #1 en: 28 Febrero 2023, 17:45 pm »

El mapa no se debe compartir tal cual, solo consultar...
Un servicio o usuario específico hace las veces de la banca, juez...
Éste es quien debiera recibir las peticiones de los usuarios para decidir su movimiento/jugada, que traslada al mapa si es posible y devuelve true, o false si el movimiento o jugada es ilegal...
Igualmente, es este servidor quien reparte los turnos a los jugadores (si el juego funciona por turnos).
...y también quien verifica cuando termina la partida, y quien inicializa la partida, previa inscripción de los jugadores...

Supongo (o al menos eso espero), que esto te ofrece una perspectiva más clara de por dónde deben ir las cosas.


En línea

maurus

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Ejecutar métodos de un objeto en otros
« Respuesta #2 en: 1 Marzo 2023, 02:23 am »

El mapa no se debe compartir tal cual, solo consultar...
Un servicio o usuario específico hace las veces de la banca, juez...
Éste es quien debiera recibir las peticiones de los usuarios para decidir su movimiento/jugada, que traslada al mapa si es posible y devuelve true, o false si el movimiento o jugada es ilegal...
Igualmente, es este servidor quien reparte los turnos a los jugadores (si el juego funciona por turnos).
...y también quien verifica cuando termina la partida, y quien inicializa la partida, previa inscripción de los jugadores...

Supongo (o al menos eso espero), que esto te ofrece una perspectiva más clara de por dónde deben ir las cosas.

sí, creo que comprendo, muchas gracias por responder.

entonces podría crear una clase juego en la que instancie los objetos mapas y personas y haga que cada uno intercambie mensajes con los demás con funciones get, set y esas cosas?

o sería mejor instanciarlos en el main y actualizar los estados y hacer el intercambio de mensajes entre los objetos en el bucle del main?

como puedes observar, es la primera vez que hago un juego, nunca pensé que iba a ser tan complicado! jaja.
« Última modificación: 1 Marzo 2023, 02:30 am por maurus » En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.357


Ver Perfil
Re: Ejecutar métodos de un objeto en otros
« Respuesta #3 en: 2 Marzo 2023, 01:02 am »

Sí. Si el juego tiene más de un jugador, es preciso tener una banca, río, juez, árbitro o jugador que hace las veces de banca...
La clase que realiza esa labor, bien puedes llamarla juego.
Nota que el tablero es una instancia y si ha de ser servida a cada jugador, cada jugador tendrá una imagen (solo lectura) del tablero, porque quien realmente maneja el tablero es la clase 'juego'...

Cada jugador cuando el 'juego' le otorgue el turno, hara su jugada indicándoselo al 'juego', el uego verifica si su jugada es legal, hace el movimiento y verifica lo que proceda (puede desencadenar ciertos acontenimientos, según el tipo de juego que sea), luego que actualice el tablero, comunica al resto de jugadores la jugada realizada por qué jugador (por ejmplo, una banda pone el nombre en ella del jugador que tiene el turno) y qué acontenicmientos ha desmbocado (por ejemplo si es un juego de cartas, que ha tirado x carta sobre la mesa, si es un juego de apuestas, el monto de su apuesta... etc...

Tampoco te complique en exceso creando objetos... es bastante común que cuando un programador nobel empieza a entender los objetos, crea objetos para cada cosa, y en vez de tener un jardin delante d ela casa, directamente al abrir la puerta tienes el Amazonas... y al final hay un objeto 'cálcular' que a su vez contiene objetos sumar, restar,... que a su vez contienen objetos número... No. No atomices todo, sólo hasta el punto lógico de entender el proceso con fluidez. Que todo quede bien ubicado entre los objetos que 'naturalmente' surjen...

Un pequeño diagrama representando cada clase, los métodos que contiene y flechas dirigiendo (clases) entre si el flujo, te permiten tener a la vista la lógica de la comunicación. Amplía en prosa (comentarios), la descripcón de cada clase, lo que hace, los miembros que tiene... es común que pasado el tiempo si no lo dominas bien o no recuerdas todos, tengas dudas que en su día ya resolviste, pero que has olvidado, un pequeño comentario te ayuda a recordar enseguida ese detalle que parece que era o es complicado.
Siempre podrás cambiarlo, pero si antes de nada partes de un esuquema, te será más fácil seguirlo y decidir si tal o cual función debe pertenecer a está o aquella clase... y entonces verás que muchas de las dudas se responden con claridad aplastante la mayoría de las veces.
En línea

maurus

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Ejecutar métodos de un objeto en otros
« Respuesta #4 en: 2 Marzo 2023, 19:07 pm »

Sí. Si el juego tiene más de un jugador, es preciso tener una banca, río, juez, árbitro o jugador que hace las veces de banca...
La clase que realiza esa labor, bien puedes llamarla juego.
Nota que el tablero es una instancia y si ha de ser servida a cada jugador, cada jugador tendrá una imagen (solo lectura) del tablero, porque quien realmente maneja el tablero es la clase 'juego'...

Cada jugador cuando el 'juego' le otorgue el turno, hara su jugada indicándoselo al 'juego', el uego verifica si su jugada es legal, hace el movimiento y verifica lo que proceda (puede desencadenar ciertos acontenimientos, según el tipo de juego que sea), luego que actualice el tablero, comunica al resto de jugadores la jugada realizada por qué jugador (por ejmplo, una banda pone el nombre en ella del jugador que tiene el turno) y qué acontenicmientos ha desmbocado (por ejemplo si es un juego de cartas, que ha tirado x carta sobre la mesa, si es un juego de apuestas, el monto de su apuesta... etc...

Tampoco te complique en exceso creando objetos... es bastante común que cuando un programador nobel empieza a entender los objetos, crea objetos para cada cosa, y en vez de tener un jardin delante d ela casa, directamente al abrir la puerta tienes el Amazonas... y al final hay un objeto 'cálcular' que a su vez contiene objetos sumar, restar,... que a su vez contienen objetos número... No. No atomices todo, sólo hasta el punto lógico de entender el proceso con fluidez. Que todo quede bien ubicado entre los objetos que 'naturalmente' surjen...

Un pequeño diagrama representando cada clase, los métodos que contiene y flechas dirigiendo (clases) entre si el flujo, te permiten tener a la vista la lógica de la comunicación. Amplía en prosa (comentarios), la descripcón de cada clase, lo que hace, los miembros que tiene... es común que pasado el tiempo si no lo dominas bien o no recuerdas todos, tengas dudas que en su día ya resolviste, pero que has olvidado, un pequeño comentario te ayuda a recordar enseguida ese detalle que parece que era o es complicado.
Siempre podrás cambiarlo, pero si antes de nada partes de un esuquema, te será más fácil seguirlo y decidir si tal o cual función debe pertenecer a está o aquella clase... y entonces verás que muchas de las dudas se responden con claridad aplastante la mayoría de las veces.
Sí, comprendo.

justamente una de las dudas que nunca he podido resolver, es lo que me dices, de pasar un objeto a otra clase para que lo consulte, por supuesto como solo lectura.
como debería hacer eso?
pasando una referencia del objeto a consultar?
porque si trato de hacer eso como leí que se hace, se la puedo pasar al constructor con el modificador const para que la referencia no se modifique, pero ahí no sé como guardar esa referencia para que otros métodos la usen, o quizás el pasarle la referencia al método que va a usarla y nada más?
estoy tratando de imaginar como se podría hacer...
En línea

RayR

Desconectado Desconectado

Mensajes: 239


Ver Perfil
Re: Ejecutar métodos de un objeto en otros
« Respuesta #5 en: 2 Marzo 2023, 20:51 pm »

Te respondo sobre lo de pasar datos como de sólo lectura, porque la forma en que funcionan las constantes en C++ es muy peculiar, y si encima lo combinas con punteros o referencias, las reglas son complejas y pueden ser confusas y muy específicas de este lenguaje.

En general, si quieres que una función no pueda modificar los parámetros que recibe, los declaras como const. Si se trata de datos "grandes" como estructuras u objetos, lo conveniente es que sean referencias o punteros const (aunque en general deberías preferir las referencias). Sin embargo, en C++ si quieres poder tener objetos constantes de alguna clase, entonces hay que declarar todas las funciones miembro de esa clase que no modifican sus variables miembro (por ejemplo, los getters) como const. Ejemplo:

Código
  1. class Mapa
  2. {
  3. ...
  4. public:
  5. int getX () const;
  6. int getY () const;
  7. ...
  8. };
  9.  
  10. int Mapa::getX () const
  11. {
  12. return x;
  13. }
  14. // etc.

Además, las variables miembro const y/o referencia (que no sean static), se deben inicializar en la lista de inicializadores del constructor:

Código
  1. class Persona
  2. {
  3. private:
  4. const Mapa& map;
  5. int x, y;
  6.  
  7. public:
  8. Persona (const Mapa &m) ;
  9. };
  10.  
  11. // Nota como se inicializa map
  12. Persona::Persona (const Mapa& m) : map{m}
  13. {
  14. x = 9;
  15. y = 18;
  16. }

Cita de: maurus
o quizás el pasarle la referencia al método que va a usarla y nada más?

También podrías hacer eso, pero que sea referencia const. En cualquier caso, no olvides declarar como const las funciones miembro de Mapa que no modifican sus datos.
En línea

maurus

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Ejecutar métodos de un objeto en otros
« Respuesta #6 en: 2 Marzo 2023, 22:49 pm »

comprendo, muy agradecido  ☺.

solo me quedó esta línea desarticulada,

Persona::Persona (const Mapa& m) : map{m}

yo entiendo que es la cabecera del constructor, pero que sucede después de los paréntesis? no comprendo por qué el mencionar a map con la m entre llaves. eso no se hace dentro de las llaves con la declaración de las otras variables?
En línea

RayR

Desconectado Desconectado

Mensajes: 239


Ver Perfil
Re: Ejecutar métodos de un objeto en otros
« Respuesta #7 en: 3 Marzo 2023, 00:52 am »

Las referencias siempre deben referirse (valga la redundancia) a algo, desde el momento de su creación, y por lo tanto se deben inicializar en su definición. Esto no es válido:

Código
  1. int& ref;

porque ¿a qué hace referencia ref? A nada. Está básicamente en el limbo, y eso no correcto. Esto sí:

Código
  1. int x;
  2. int& ref = x;

Y algo similar ocurre con las constantes. En el caso de los constructores, las variables miembro son creadas antes de que el constructor se ejecute. El constructor simplemente les asigna valores. Por eso esto no sería válido:

Código
  1. Persona::Persona (const Mapa& m)
  2. {
  3. /* Error: antes de haber llegado aqui (al cuerpo del constructor), ya se deberia
  4. haber creado la variable mapa, pero obviamente no hay nada a lo cual haga referencia
  5. (seria como en el ejemplo incorrecto que te puse al inicio de este mensaje) */
  6.  
  7. /* Esta linea no estaria inicializando map (como te dije, eso sucede antes de ejecutar
  8. el constructor) sino simplemente intentando cambiar su valor. */
  9. map = m;
  10. }

Para eso se deben usar las listas de inicializadores de miembros en los constructores:

Código
  1. Clase::Clase() : variable_miembro{valor_de_inicializacion}

Esto hace que "variable_miembro" se cree e inicialice con el valor indicado. Eso se ejecuta antes de llamar al constructor.

Nota, también se pueden usar paréntesis en lugar de llaves:

Código
  1. Persona::Persona (const Mapa& m) : map(m)

Aunque hay diferencia entre estas dos formas (paréntesis y llaves), de momento lo mejor es no complicarte y usar la que te guste más. No sé si ya estés leyendo algún manual de C++, pero si no, deberías conseguirte uno para aprender estos temas, ya que hay otras circunstancias en las que es recomendable (y a veces necesario) inicializar las variables de esta manera.

Por cierto, en mi anterior respuesta me limité a decirte cómo podías hacer lo que preguntabas en tu último mensaje, pero no necesariamente pienso que alguna de las dos formas que mencionaste (tener una referencia como miembro o pasarla a las funciones que la necesiten) sea la más correcta. Por lo que veo, aún tienes un nivel básico, por lo que, si de verdad necesitas que los personajes accedan al mapa, probablemente sea mejor la segunda opción: simplemente pasar referencias const a las funciones. Tener como variable miembro una referencia viene con ciertas complicaciones que sería mejor evitar mientras no tengas más experiencia.
En línea

maurus

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: Ejecutar métodos de un objeto en otros
« Respuesta #8 en: 3 Marzo 2023, 01:52 am »

sí, estás en lo correcto, hace un año que empezé a aprender a programar oficialmente ☺

no sé porqué me gusta c++, siempre sentí algo especial ☺.
me voy a poner a leer el manual entonces.

saludos.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
como usar un mismo objeto dentro de dos metodos
.NET (C#, VB.NET, ASP)
greenselves 1 1,994 Último mensaje 27 Mayo 2011, 01:10 am
por neoncyber
De USB a USB [Extracción de datos mediante BATCH u otros métodos] « 1 2 »
Scripting
futurehack 10 7,743 Último mensaje 27 Septiembre 2012, 12:57 pm
por Eleкtro
Aircrack u otros metodos.
Hacking Wireless
MrVndT 4 3,368 Último mensaje 10 Enero 2017, 06:58 am
por Sh4k4
Objeto history y sus métodos.
Desarrollo Web
NextByte 0 1,263 Último mensaje 28 Marzo 2019, 01:26 am
por NextByte
Afectar a los métodos de la clase en función del nombre del objeto.
Programación C/C++
Anticiudadano01 1 1,390 Último mensaje 23 Agosto 2019, 13:51 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines