Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Mis preguntas sobre C++

Iniciado por tewe76, 08 de Febrero de 2009, 03:34:22 PM

« anterior - próximo »

tewe76

Como ya he comentado en otros hilos, estoy haciendo un juego al tiempo que aprendo C++, o viceversa ;).
Estoy siguiendo más o menos el famoso curso de http://c.conclase.net/curso/index.php pero, claro, me surgen algunas dudas que espero que me ayudéis a resolver ::).
Y para no crear un hilo cada vez que tenga una pregunta, las pondré todas aquí.

Empiezo por una sencilla:
¿Las Clases tienen algún máximo de memoria? ¿Tiene sentido que me cree una "superclase" que contenga todas las variables y funciones de mi programa, o me dará problemas de memoria y/o de rendimiento?

Gracias 8)
Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos

arkangel2803

Una classe es lo mas parecido a una estructura en C, por lo tanto, yo no conozco que tenga 'limite' de memoria esceptuando el de la propia maquina (4Gb).

Lo que si que tiene limite de memoria es el stack que tienen los programas, o en ese cas tu programa, a la hora de definir variables 'globales' como se les suele llamar. En ese punto es donde entra la memoria dinamica, los new's, deletes y tal.

Yo si te tengo que recomendar algo, es todo lo contrario a los que estas haciendo o pensando. Piensa en fragmentacion, no hagas 1 clase, haz 10, y con el paso del tiempo veras cuales de esas classes puedes juntar. Pero lo mejor de ese metodo es que podras 'reutilizar' codigo. Cuanto mas grandes y mas cosas hacen las clases menos reutilizacion tienen.

Y si me permites darte un consejo en C++, acostumbrate desde el principio a definirle a cada una de las classes que hagas las siguientes funciones:

- constructor por defecto
- constructor copia
- destructor
- operador =
- operador ==
- operador <

Teniendo las classes definidas de esta manera y definiendo luego algunos 'consts' en funciones de Get(...), pasarte a utilizar las listas, vectores, maps de las STL sera casi transparente.

Un saludo y suerte

LLORENS

P.D: No olvides empezar por un juego sencillo

davur

Cita de: tewe76 en 08 de Febrero de 2009, 03:34:22 PM
¿Tiene sentido que me cree una "superclase" que contenga todas las variables y funciones de mi programa, o me dará problemas de memoria y/o de rendimiento?

No. Una clase, una responsabilidad. No necesariamente por motivos de rendimiento, sino de buen diseño.

tewe76

CitarLo que si que tiene limite de memoria es el stack que tienen los programas, o en ese cas tu programa, a la hora de definir variables 'globales' como se les suele llamar.
¿Y cuál es ese límite? ¿Depende de la máquina?
CitarYo si te tengo que recomendar algo, es todo lo contrario a los que estas haciendo o pensando.
Vale, creo que me he confundido ::)
Me da la sensación de que quería conseguir con Clases lo que se supone que hay que hacer con Namespaces. Mi idea era hacer una superclase que contuviese variables de otras subclases, para que todo en mi engine estuviese estructurado tal que:
" TWIrr.Debug.Texto.Info="Hola"; ", por ejemplo. Pero me da la sensación de que para éso lo que tengo que usar son namespaces, con los que conseguiré algo similar:
" TWIrr::Debug::Texto::Info="Hola"; "
¿Es así como se hace? (Entendéis mi objetivo, ¿no?)
CitarY si me permites darte un consejo en C++,
No te permito, sino que te insto a que me lo des ;)
Citaracostumbrate desde el principio a definirle a cada una de las classes ...
Sí, el cons y el des ya lo estaba haciendo. Lo demás no porque aún no sé lo que son ::)
CitarP.D: No olvides empezar por un juego sencillo
Bueno, considero que mi "juego sencillo" es en sí el "miniengine sobre IrrLicht" que me servirá de base para el "juego grande". Me salto pasos porque soy nuevo en C++, pero no en la programación de juegos :).

CitarNo. Una clase, una responsabilidad. No necesariamente por motivos de rendimiento, sino de buen diseño.
Sí, si en realidad estoy aplicando ese concepto. Me expliqué mal, porque no pretendía hacer UNA SOLA clase con todo, sino una CLASE MADRE que contuviese un montón de subclases.

Bueno, como he metido mucho rollo, os recuerdo mi nueva pregunta actual: para lo que quiero, lo que tengo que usar son namespaces, ¿no?
Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos

Pogacha

Mi querido tewe estas preguntas son muy generales.
Tendras que leer mas teoria y veras que solas se disipan.

Segun lo que leo aun no has captado el paradigma de la programacion orientada a objetos.
Thinking in C++
Te puede ayudar con eso.

En teoria no deberias tener datos estaticos salvo puntuales exepciones, y pensar el desarrollo en objetos.


tewe76

Tengo el PDF de "Thinking in C++" y le echo vistazos, pero no me gustaría aprender C++ en plan: "hale, voy a leerme un libro de 800 páginas" (aunque no niego que quizá fuese buena idea ::))
Justamente mi idea es preguntar cosas "generales", en el sentido de que no es cuestión de buscar una palabra en google y ya está, sino conceptos, usos generales, consejos, etc.

Volviendo a mi pregunta:
- Mirando el código del IrrLicht, creo que usan ese sistema de namespaces: tienen un namespace "irr" en el que declaran variables, funciones y también clases. Y, dentro de ese "irr" crean otros sub-namespaces ("core", "video", etc) con sus variables, etc. En principio me parece un método coherente.
- Sin embargo, mirando el código del Tetris de loover, no parece que use namespaces, sino básicamente clases con sus variables, funciones y objetos de otras subclases. Lo que no veo es que use una "Clase madre".

He implementado tanto una solución como la otra y funcionan ambas, y ambas me parecen coherentes, pero tengo que elegir una de ellas (y entender por qué unos usan una y otros usan otra). Sospecho que el motivo es simplemente que IrrLicht es un proyecto MUY complejo y el Tetris es bastante sencillo. Creo que esa es la diferencia, pero no lo sé.

¿Son correctas mis deducciones? Si ambos métodos son posibles, ¿cuál recomendáis?
Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos

Eskema

Cita de: arkangel2803 en 08 de Febrero de 2009, 03:55:09 PM

Y si me permites darte un consejo en C++, acostumbrate desde el principio a definirle a cada una de las classes que hagas las siguientes funciones:

- constructor por defecto
- constructor copia
- destructor


Aqui tambien pregunto yo, ¿para que sirve el constructor copia?, si con el base yo me arreglo, ¿para que quiero el copia con otros parametros?. No digo que no pueda ser util, pero si tengo:


Coche (potencia, velocidad, aceleracion)


¿para que quiero ademas?


Coche (potencia, velocidad, aceleracion, marcacoche,etc)


Supongo que dependiendo de lo que hagas podra ser de utilidad o no, ¿no?

shephiroth

Eskema: Me temo que se referia a un clone, un duplicado del objeto. Lo que no se si se refiere a hacer un "public obj* obj.clone()" o a "public obj(obj origen)". Para la primera aconsejo crear un constructor sin parametros privado, aunque puede q sea mejor la segunda.

Respecto al tema que comentas de usar namespaces o una clase con objetos de otras clases, que a su vez tengan objetos que referencien al debug en cuestion.....a mi me parece que depende mas de como sea la persona y de que lenguajes se venga........yo antes de empezar con java utilizaba la segunda (clases con objetos de otras clases...), pero en java me estoy acostumbrando a lo que serian los namespaces (llamados package) a crear singletones estaticos para ese tipo de servicios.

Vicente

Cita de: tewe76 en 09 de Febrero de 2009, 12:12:19 PM
He implementado tanto una solución como la otra y funcionan ambas, y ambas me parecen coherentes, pero tengo que elegir una de ellas (y entender por qué unos usan una y otros usan otra). Sospecho que el motivo es simplemente que IrrLicht es un proyecto MUY complejo y el Tetris es bastante sencillo. Creo que esa es la diferencia, pero no lo sé.

¿Son correctas mis deducciones? Si ambos métodos son posibles, ¿cuál recomendáis?

Si son como los namespaces de C#, tus deducciones son correctas :) Los namespaces se usan para agrupar "cosas" que tienen una funcionalidad parecida de forma que luego sean más coherentes de usar y buscar. A mi me parece una buena norma el meter cada cosa en su namespace, aunque sea un proyecto pequeñito :)

Un saludo,

Vicente

davur

#9
Cita de: tewe76 en 09 de Febrero de 2009, 12:12:19 PM
Tengo el PDF de "Thinking in C++" y le echo vistazos, pero no me gustaría aprender C++ en plan: "hale, voy a leerme un libro de 800 páginas" (aunque no niego que quizá fuese buena idea ::))
Justamente mi idea es preguntar cosas "generales", en el sentido de que no es cuestión de buscar una palabra en google y ya está, sino conceptos, usos generales, consejos, etc.

Volviendo a mi pregunta:
- Mirando el código del IrrLicht, creo que usan ese sistema de namespaces: tienen un namespace "irr" en el que declaran variables, funciones y también clases. Y, dentro de ese "irr" crean otros sub-namespaces ("core", "video", etc) con sus variables, etc. En principio me parece un método coherente.
- Sin embargo, mirando el código del Tetris de loover, no parece que use namespaces, sino básicamente clases con sus variables, funciones y objetos de otras subclases. Lo que no veo es que use una "Clase madre".

He implementado tanto una solución como la otra y funcionan ambas, y ambas me parecen coherentes, pero tengo que elegir una de ellas (y entender por qué unos usan una y otros usan otra). Sospecho que el motivo es simplemente que IrrLicht es un proyecto MUY complejo y el Tetris es bastante sencillo. Creo que esa es la diferencia, pero no lo sé.

¿Son correctas mis deducciones? Si ambos métodos son posibles, ¿cuál recomendáis?

Estás poniendo en una balanza dos cosas que no se utilizan con el mismo fin. Los namespaces proporcionan un mecanismo de aislamiento del espacio de nombres global, lo cual es útil de cara a la organización lógica del código, y además ayuda a evitar conflictos de nombres. Especialmente en una librería, es buena práctica utilizar namespaces con criterio.

Pero el hecho de que utilices namespaces no tiene nada que ver, funcionalmente hablando, con la jerarquía de clases de tu código, que utilices una "clase madre", etc.

davur

Cita de: arkangel2803 en 08 de Febrero de 2009, 03:55:09 PM
Y si me permites darte un consejo en C++, acostumbrate desde el principio a definirle a cada una de las classes que hagas las siguientes funciones:

- constructor por defecto
- constructor copia
- destructor
- operador =
- operador ==
- operador <

Teniendo las classes definidas de esta manera y definiendo luego algunos 'consts' en funciones de Get(...), pasarte a utilizar las listas, vectores, maps de las STL sera casi transparente.

No en todas las clases tiene sentido definir alguna o algunas de esas funciones. De hecho, en algunas clases tiene sentido hacer precisamente lo contrario.

Warchief

#11
Yo últimamente me había acostrumbrado (si se puede combinar "últimamente" y un tiempo pasado) a usar boost::noncopyable para detectar errores en operador de asignación y constructor de copia no implementados.

<editando>

Por cierto, creo que nadie ha respondido al constructor de copia.
Puedes leer en el tutorial de c.conclase lo que es. No es lo mismo copiar un objeto que crear uno nuevo mediante un constructor con una determinada signatura.

En resumen, hace falta cuando copiar los atributos no funciona (comportamiento por defecto). Por ejemplo, cuando tienes un puntero al que le pertenece la memoria, es decir, que va a ser liberado al destruir un objeto, dejando al otro (que al ser copiado apunta al mismo sitio) en un estado de error. En lugar de copiar el puntero, se quiere copiar el contenido del puntero. No es el 100% de los casos de punteros, en otros sí se quiere copiar el puntero, porque la memoria no pertenece al objeto.

tewe76

CitarRespecto al tema que comentas de usar namespaces o una clase con objetos de otras clases, que a su vez tengan objetos que referencien al debug en cuestion.....a mi me parece que depende mas de como sea la persona y de que lenguajes se venga........
CitarSi son como los namespaces de C#, tus deducciones son correctas  Los namespaces se usan para agrupar "cosas" que tienen una funcionalidad parecida de forma que luego sean más coherentes de usar y buscar. A mi me parece una buena norma el meter cada cosa en su namespace, aunque sea un proyecto pequeñito
CitarEstás poniendo en una balanza dos cosas que no se utilizan con el mismo fin. Los namespaces proporcionan un mecanismo de aislamiento del espacio de nombres global, lo cual es útil de cara a la organización lógica del código, y además ayuda a evitar conflictos de nombres. Especialmente en una librería, es buena práctica utilizar namespaces con criterio.

Pero el hecho de que utilices namespaces no tiene nada que ver, funcionalmente hablando, con la jerarquía de clases de tu código, que utilices una "clase madre", etc.
Vuestras respuestas son un poco incoherentes entre sí, pero creo que todos venís a decir, más o menos, que namespaces y clases no son incompatibles, que cada uno sirve para lo suyo, y que ambos son convenientes. Así pues, mi conclusión (ahora ::)) es que sí tiene sentido crear una clase madre, pero entonces volvemos a la duda original:
¿Es bueno crear una clase enorme (en cuanto a memoria, no en cuanto a miembros)? arkangel2803 ha dicho que no hay límite de tamaño para las clases, pero sí para las variables globales. Y, obviamente, si creo una clase madre es para crear una variable global de esa clase ???
Pensaba que la pregunta era sencilla, pero veo que se complica, y no lo entiendo...
¿Vosotros no usáis un método tipo "Juego -> Render -> Dibujar" (es un ejemplo, no lo toméis al pie de la letra)? ¿Cómo lo implementáis?
Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos

Vicente

A ver, un ejemplo que lo mismo te ayuda:

- Un namespace es una agrupación de CLASES que tienen un sentido en la vida similar. Es como la agrupación de contenidos que haces tu en tu ordenador con las carpetas: Mis Documentos tiene ficheritos de texto, Mi Musica mp3s, etc etc.

- Una clase madre es simplemente una forma de agrupar código que es común a un conjunto de clases. Tu en Mis Documentos tienes muchos documentos diferentes: PPTs de chorradas, CVs, cartas,... Y puede que para escribir cartas siempre uses una plantilla especial de carta y luego la modifiques para cada carta en concreto, esa plantilla sería como la superclase que contiene las cosas comunes de todas las demás cartas (que serían lo que se llama la especialización de la superclase).

Espero que te ayude a entender la diferencia entre para que vale una cosa y para que vale la otra, pero seguro que hay ejemplos mejores :p

Un saludo!

Vicente

lemoniac

Según donde declares el objeto o como instancies la clase, se reservará memoria en el heap, en el stack o en el segmento de datos (new/malloc, variables locales, variables globales). La pila y el segmento de datos tienen máximos con los que no es bueno jugar, por si cambiamos de arquitectura y la cosa deja de ir. El máximo que puedas reservar en el heap dependrá de la RAM que tengas libre y de lo fragmentada que esté.

De todas formas esa clase madre de la que hablas, pues no debería de ser más que un conjunto de punteros a los diferentes subsistemas de los que contará tu juego (lógica, vídeo, audio, ...) y un puñado de métodos. Así que no tendría que ocupar ni unos centenares de bytes de esos que te preocupan tanto.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.