Galahad78 Posted April 23, 2013 Report Share Posted April 23, 2013 Buenas tardes hamijos, como algunos ya sabréis, soy uno de los engañados por Darkness miembros del equipo del AWACS TacSim. Aunque al principio me encargué de la documentación, tras terribles amenazas tanto a Xifu como a mi nos ha picado el gusanillo de la programación, y en ello estamos. Mientras que Xifu se encargará de echar un cable a Darkness con el Objective C, yo me encargaré de no estorbar demasiado a Disablez con el C++. Aunque tengo algo de experiencia con C, que estoy desempolvando, el mundo de C++ y los objetos es algo nuevo para mi. Así que utilizaré este hilo para exponer las dudas que me vayan surgiendo, tanto para que los expertos en el tema me podáis ayudar, como recordatorio para cuando estemos en el E3 en el lanzamiento mundial de nuestro nuevo simulador. Quote Link to comment Share on other sites More sharing options...
Galahad78 Posted April 23, 2013 Author Report Share Posted April 23, 2013 Pues vamos al turrón, y desde el principio. Tengo la siguiente definición de una clase: class Guitar { private: int numberOfStrings; public: Guitar(); ~Guitar(); int getNumberOfStrings(); void setTypeOfGuitar(int type); }; Sencillita, para empezar suave. La duda me surge cuando en el ejemplo utiliza el siguiente código: // Create the object. Guitar* guitar = new Guitar; // Give it a type. guitar->setTypeOfGuitar( kGuitarTypeBanjo ); A la hora de crear el objeto, ¿qué significa el primer Guitar*? ¿No sería suficiente con el siguiente código? Guitar Fender; A la hora de llamar a la función miembro, ¿qué diferencia hay entre emplear -> o esta otra notación)?: guitar.setTypeOfGuitar(kGuitarTypeBanjo); Quote Link to comment Share on other sites More sharing options...
Blackleg Posted April 23, 2013 Report Share Posted April 23, 2013 (edited) El Guitar* ese no es un puntero? No seria así. Guitar electrica; electrica.setTypeOfGuitar(apilas); Objetos_y_Clases Edited April 23, 2013 by Blackleg Quote Link to comment Share on other sites More sharing options...
kayucoman Posted April 23, 2013 Report Share Posted April 23, 2013 yo estoy aprendiendo C para programar el Arduino pero aun me pierdo bastante. Quote Link to comment Share on other sites More sharing options...
Disablez Posted April 24, 2013 Report Share Posted April 24, 2013 En la primera declaras una variable del tipo guitar. En el segundo caso lo que creas es un puntero (o apuntador) ue sirve para apuntar a variables guitar. Un puntero no almacena guitarras, sino la direccion de memoria donde tienes una guitarra. (e.g. 0x000001) Al crear un puntero a palo seco, no apunta a nada, en el caso de este código le pides que cree una guitarra nueva (new guitar() ) y asigne la dirección a esa variable. Entonces, para jugar un poco... Guitar miguitarra(tipoA); Guitar* guitarrapuntero=NULL; -> guitarrapuntero vale 0x00000. guitarrapuntero=new Guitar(tipoB) -> Crea un objeto de tipo guitarra, y asigna su dirección de memoria al puntero, en este caso 0x00017 por ejemplo. // guitarrapuntero=0x00017 Teniendo un puntero (una dirección de memoria) podemos acceder al objeto que apunta con "*puntero". En este caso *guitarrapuntero sería nuestra guitarra tipoB, Del mismo modo, teniendo un objeto podemos obtener su posición en memoria con "&objeto". Por tanto &miguitarra vale, por ejemplo 0x000014 Y puede hacer chuminadas como guitarrapuntero=&miguitarra, y guitarrapuntero apuntara a la tipoA. Date cuenta... si apunta a la tipoA, la tipoB se ha perdido, no tienes donde agarrarla :) así que cuidado con esas cosas ( y con los memory leaks que no entran en este tema) Lo de . o -> ... para llamar un método se usa "objeto.metodo" . En el caso de un puntero, tendrías que obtener el objeto al que apunta "(*puntero)" y luego usar su método "(*puntero).metodo". Esto es un poco aburrido así que la nomenclatura directa puede ser también puntero->metodo. Según te aburras, usas una u otra. Quote Link to comment Share on other sites More sharing options...
Galahad78 Posted April 24, 2013 Author Report Share Posted April 24, 2013 En la primera declaras una variable del tipo guitar. En el segundo caso lo que creas es un puntero (o apuntador) ue sirve para apuntar a variables guitar. Un puntero no almacena guitarras, sino la direccion de memoria donde tienes una guitarra. (e.g. 0x000001) Al crear un puntero a palo seco, no apunta a nada, en el caso de este código le pides que cree una guitarra nueva (new guitar() ) y asigne la dirección a esa variable. Entonces, para jugar un poco... Guitar miguitarra(tipoA); Guitar* guitarrapuntero=NULL; -> guitarrapuntero vale 0x00000. guitarrapuntero=new Guitar(tipoB) -> Crea un objeto de tipo guitarra, y asigna su dirección de memoria al puntero, en este caso 0x00017 por ejemplo. // guitarrapuntero=0x00017 Teniendo un puntero (una dirección de memoria) podemos acceder al objeto que apunta con "*puntero". En este caso *guitarrapuntero sería nuestra guitarra tipoB, Del mismo modo, teniendo un objeto podemos obtener su posición en memoria con "&objeto". Por tanto &miguitarra vale, por ejemplo 0x000014 Y puede hacer chuminadas como guitarrapuntero=&miguitarra, y guitarrapuntero apuntara a la tipoA. Date cuenta... si apunta a la tipoA, la tipoB se ha perdido, no tienes donde agarrarla :) así que cuidado con esas cosas ( y con los memory leaks que no entran en este tema) Lo de . o -> ... para llamar un método se usa "objeto.metodo" . En el caso de un puntero, tendrías que obtener el objeto al que apunta "(*puntero)" y luego usar su método "(*puntero).metodo". Esto es un poco aburrido así que la nomenclatura directa puede ser también puntero->metodo. Según te aburras, usas una u otra. Vaaalee, entonces utiliza Guitar* para crear un puntero, y -> para usar el método sobre el puntero. Gracias Dis! Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.