Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Clases Anidadas En C++

Iniciado por Marci, 11 de Marzo de 2006, 05:23:08 PM

« anterior - próximo »

zupervaca

 Yo no uso std pero me parece que al usar push_back estas pasandolo por referencia y no hace copia, lo mas seguro que al poner Cmesh* te de error ya que le sera imposible resolver Cmesh*&, otra cosa, en un manager deberia de poder indicarse un indice para cada recurso y asi reaprovecharlo.

AK47

 Las STL funcionan a base de copias, por lo que si le pasas un Cmesh al push_back, te lo va a copiar, con el consiguiente problema de punteros copiados al tuntun etc. Para controlar esto puedes definir el constructor de copia y el operador de asignación, o usar un std::vector (no olvidarse de borrar los punteros cuando toque, que nos conocemos :D). Tampoco estaría mal usar el std::string en vez de const char *, pero esto último es pa chinchar, más que nada  :P  

zupervaca

 Pues segun estos links no es asi, podria poner mas, pero en principio siempre que he puesto links no se han hecho caso.

http://www.cppreference.com/cppvector/push_back.html
http://decsai.ugr.es/~mgs/ed/stl.html
http://support.microsoft.com/?scid=kb;es;158620

Citarvoid vector::push_back(const _TYPE& X);
Se pasa por referencia, con lo que no realiza una copia.

Si a lo que te refieres es que dentro de esta funcion crea una clase copia pues si, son una mierda las std :P

AK47

 En efecto, me refería a que es dentro de push_back se copia lo que apunta la referencia. Mmmmm, ¿por que son una mierda las STL? Yo creo que están de puta madre :)

Marci

 Bueno, pues a pesar de que funcionaba lo he cambiado siguiendo varias de las ideas que me habeis dado. Basicamente he sacado la clase CLoader del interior de la clase CMesh. Ahora si quiero cargar una malla, una textura o lo que sea:

   CLoader Loader;

   CMesh Mesh;
   Loader.Load("Malla.obj", Mesh);

   CTexture Texture;
   Loader.LoadTexture("Textura.bmp", Texture);


A mi las STL me van bien para la mayor parte de los casos.

Flint

 
Cita de: "AK47"Mmmmm, ¿por que son una mierda las STL? Yo creo que están de puta madre :)
Y efectivamente, STL está de puta madre. Muchos consideran que su uso en el desarrollo de videojuegos es inadecuado por lo que respecta al rendimiento; en realidad, el problema muchas veces está en la elección de la estructura de datos concreta a utilizar: si eliges la estructura incorrecta evidentemente el rendimiento no será el óptimo. Del mismo modo, puede haber problemas con la reserva dinámica de memoria para un contenedor particular o con la introducción de copias extras al copiar elementos. También tienes inconvenientes como el depurado de código, los mensajes de error crípticos y la reserva de memoria en entornos como las consolas.

Es decir, que la gran mayoría de problemas vienen asociados al desconocimiento de lo que ocurre a nivel interno cuando se trabaja con STL. En situaciones específicas podrás crear estructuras más rápidas, utilizando conocimientos avanzados de los datos con los que trabajes o de la plataforma sobre la que se ejecute tu programa.

Decir que STL es una mierda implica admitir no tener ni puta idea de STL. Lo importante es saber elegir la herramienta adecuada para el trabajo adecuado. Y STL cumplirá con creces en la gran mayoría de ocasiones. Porque no hay que olvidar que STL es el producto de una mejora continuada con el paso de los años por parte de cientos de programadores, y el resultado es un código robusto, genérico y fiable; que, insisto, será la mejor elección en la mayoría de los casos.

Y que esto lo diga yo no tiene ninguna importancia, pero recordemos que en la inmensa mayoría de  libros o papers actuales sobre desarrollo de videojuegos se utiliza STL sin plantearse la conveniencia de su uso.

zupervaca

 Son una mierda por que dan una funcionalidad peor que escasa, ademas de que si traceas el codigo te puede dar la risa de las chapuzas que se ven para ser algo que se quiere mostrar como estandar.

CitarDecir que STL es una mierda implica admitir no tener ni puta idea de STL
Sabia que estarías al acecho :P, STL es esto, si te parece un trabajo de años no quisiera ver lo que tardarían en hacer algo decente, solo se puede decir una cosa, obsoleto.

Flint

 
Cita de: "zupervaca"Son una mierda por que dan una funcionalidad peor que escasa, ademas de que si traceas el codigo te puede dar la risa de las chapuzas que se ven para ser algo que se quiere mostrar como estandar.
Estaría bien que dieras ejemplos concretos antes de afirmar eso tan tajantemente.

Pero, oye, que no voy a ser yo quien te intente convencer de las bondades de STL (y de sus inconvenientes, que algo ya he comentado). Lo tomas o lo dejas.

nsL

 Yo no puedo decir que sean buenos o malos por desconocimiento. Eso si, la unika vez q intente usar vector, con sus queridos pop y push no iba ni p'atras. De hecho puse en su dia un post aqui, y la gente no sabia el porque de su No funcionamiento :P

Saludos!

PD: Mi post del que hable
Yo no muero hasta la muerte -

zupervaca

 Un ejemplo mas claro de por que son una mierda es un tio que esta empezando a programar en basic y le enseñan el gosub, el dira que es una pasada, dentro de un tiempo vera las funciones y dira que son una pasada y que vaya mierda el gosub, pues basicamente esto es lo que pasa con stl, el dia que den un buen soporte como las collections del csharp me callare la boca y pondre el culo en pompa :D

AK47

 Hombre, creo que ahí faltan los algoritmos de las STL. Además, lo bueno de los mismos no son solo estas cosas sino todos los conceptos que usan (iteradores, etc), de forma que cada cual puede crear un "containers" que aproveche toda la infraestructura de las STL.

Flint

 
Cita de: "zupervaca"Un ejemplo mas claro de por que son una mierda es un tio que esta empezando a programar en basic y le enseñan el gosub, el dira que es una pasada, dentro de un tiempo vera las funciones y dira que son una pasada y que vaya mierda el gosub, pues basicamente esto es lo que pasa con stl, el dia que den un buen soporte como las collections del csharp me callare la boca y pondre el culo en pompa :D
Vamos, que no dices nada. Quizá porque realmente no conoces STL o no la has tocado a fondo.  :lol:

Cita de: "zupervaca"Hombre, creo que ahí faltan los algoritmos de las STL. Además, lo bueno de los mismos no son solo estas cosas sino todos los conceptos que usan (iteradores, etc), de forma que cada cual puede crear un "containers" que aproveche toda la infraestructura de las STL.

Efectivamente. Entre las estructuras de datos y los algoritmos de STL, tienes un sistema potentísimo a tu disposición.

zupervaca

 
CitarVamos, que no dices nada. Quizá porque realmente no conoces STL

Puse esto:
CitarSon una mierda por que dan una funcionalidad peor que escasa
Citarel dia que den un buen soporte como las collections del csharp me callare la boca y pondre el culo en pompa
En definitiva para cualquier persona le valdria para picarle la curiosidad e ir a ojear las collections de csharp.

Los iterators estan explicados aqui que se encuentra en la misma pagina web que he puesto antes, solo era pulsar sobre el link superior izquierda "cppreference.com" y luego se veia el link abajo a la derecha, los iterators no son nada nuevo ni cuando se empezo a hacer la stl.

Sobre el ejemplo del basic con el gosub y las funciones creo que no lo entendiste, es sencillo, si no se ha visto nada mejor (no quiero ofender con esto ya que no ver nada mejor no significa ser peor ni nada por el estilo) pues claro que son una pasada, pero para el que ha visto cosas mejores son una mierda.

LC0

 Vaya la que se ha montado con la STL...

El mayor problema que puede encontrarse programando con estas puede llegar a ser la declaración de tipos de datos, como iteradores o contenedores anidados, pudiendo llegar a verse cosas como "std::map, std::set > > >::reverse_iterator", pero no es nada que no se pueda arreglar con unos typedef's bien situados.
Lo bueno de la STL es que es puedes usar la estructura más apropiada según tus necesidades, y no matar una mosca a cañonazos como viene siendo habitual últimamente.
Por ejemplo, si quieres indexación, usa un vector o un deque, pero ten en cuenta que puede darse el caso de que, al hacer un push_back en un vector (no se si pasará lo mismo con los deques), puede ser que se reserve una nueva zona de memoria equivalente en tamaño (corregidme si me equivoco) a la ya asignada para este.
Una lista, por el contrario, no te va a hacer eso, pero ojito si tienes que acceder a los elementos de esta: No hay indexación, por lo que te ves obligado a hacer una búsqueda de orden O(n).

Para mi, la STL es la mejor biblioteca para un lenguaje jamás construida. Viene a ser como la Gentoo es a GNU/Linux :D.
 

AK47

 Eso de los chorizos "STL"riles se solucionará en parte con la próxima iteración de C++, que traerá la palabra clave "auto", con el que podras hacer cosas como:
std::map<chorizo impresionante> mapaNoseke;

for(auto it = mapaNoseke.begin(); it != mapaNoseke.end(); ++it)
{
 // Bla bla
}