Jump to content

Nuevo en la clase(s) - C++


Galahad78

Recommended Posts

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.

Link to comment
Share on other sites

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);

 

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

Some pretty cookies are used in this website