Pues he escuchado Fear Inoculum…

Vosotros sabéis de buena fe que no me gusta Tool. Y lo he intentado. He escuchado Undertow, Lateralus y 10000 Days. Pero es que no me llegan. Me parecen bastante aburridos y Maynard no me gusta como canta, así de simple. Lo único impresionante que tienen son los ritmos, pero ya está.

Advierto que este post solo tira tralla a Tool así que si te enfadas leyéndolo y te lo tomas en serio te invito a pulsar Control W y proseguir con tu vida.

Continuar leyendo «Pues he escuchado Fear Inoculum…»

cómo aprender c++ y no morir en el intento #10. métodos de clases.

#seguim.

Anteriormente os expliqué qué era una clase y cómo se implementaba en C++, al menos el esqueleto de ella. (constructor por defecto, un par de atributos y el destructor). En el capítulo de hoy os explicaré cómo le añadimos métodos a la clase para que haga algo y le demos uso.

Antes de todo quiero explicaros la privacidad de los atributos, tenemos tres tipos, public, private y protected.

public: Los métodos o atributos que tengamos aquí pueden usarse y verse desde cualquier sitio del programa, desde el main o cualquier otra clase, sólo se usa para los métodos o una clase muy pequeña de apoyo.

private: Sólo la propia clase puede acceder a los atributos o métodos.

protected: Sólo los hijos de la clase podrán ver los atributos y los métodos. (usado para herencia)

Partiendo del ejemplo anterior, clase Canción. Vamos a tener que acceder a los atributos para trabajar con ellos. No sería lo ideal hacer desde cualquier lado unaCancion.duracion = 5; ya que eso es bastante chapuza e inseguro, para eso usamos métodos «get» y «set», que son métodos para conseguir un dato y para cambiarlo de forma segura.

Para crear los denominados «get» y «set» nos vamos primero al .h y escribimos los get que necesitamos. Tened en cuenta el tipo de atributo que es. Luego escribimos {return dato;}
Un ejemplo:

	std::string getArtista() { return artista; }
	std::string getTitulo() { return titulo; }
	unsigned int getDuracion() { return duracion; }
        //con esto ahorramos líneas en el .cpp, aunque puedes ponerlo en el .h

Vamos a pasar a los set. Los set suelen ser de tipo void porque no necesitamos que devuelva nada.

//los set son de tipo void pero siempre llevan un argumento, lo que le quieres poner al atributo
void setArtista(std::string a) { artista = a; }
void setTitulo(std::string t) { titulo = t; }
void setDuracion(unsigned int d) { duracion = d; }
//agrego uno con int normal para simplificar la programación
void setDuracion(int d) { duracion = d; }
//se pueden sobrecargar los métodos, como sabrás

Una vez que tenemos eso, vaoms a pasar a los distintos tipos de constructores. Hay 3, el constructor por defecto, el parametrizado y el constructor copia. El constructor copia es el más importante porque tiene muchísimo poder.

Vamos a ver el constructor por defecto, se llama cuando creamos un objeto así:

Cancion unaCancion;

Yo normalmente programo este constructor en el .h, para tenerlo todo más organizado. Para programarlo tienes que poner dos puntos después de los paréntesis, con esto hacemos algo llamado «secuencia de inicialización». Luego vamos escribiendo cada uno de los atributos, escribimos unos paréntesis y dentro de los paréntesis escribimos cómo queremos construir el atributo. Luego abrimos y cerramos llave porque es un método. Puedes escribir código ahí, se ejecutará después de la secuencia de inicialización. Como es un constructor por defecto vamos a dejar que tenga valores vacíos:

Cancion(): artista(""), titulo(""), duracion(0) { }
//con esto tenemos una canción con un artista y título vacío con 0 segundos de duración.

El constructor parametrizado es similar, sólo añadimos parámetros y construimos los atributos a partir de los parámetros. La llamada sería así:

Cancion thela("King Crimson", "Thela Hun Ginjeet", 6);

Ejemplo:

Cancion(std::string a, std::string t, unsigned int d): artista(a), titulo(t), duracion(d) { }

Ya por último nos queda el constructor copia. Es el más potente de los 3. Es importante programarlo bien ya que si tenemos punteros en nuestra clase es posible que tengamos problemas si no lo programamos bien o dejamos al compilador que haga el trabajo sucio por nosotros.

Llamada:

Cancion thela2(thela);

Ejemplo:

Cancion(Cancion &c): artista(c.artista), titulo(c.titulo), duracion(c.duracion) { }

Como veis, sólo tenemos un parámetro, que es el objeto del que copiamos y construimos el nuevo objeto a partir del anterior. Si tenemos punteros o es una estructura de datos casera habría que hacer más cosas dentro de las llaves, pero eso os lo enseñaré otro día. Por ahora no tenéis que hacer nada más.

Con esto ya tenéis para programar clases sencillas con algunos métodos complejos. Muchos de los métodos de las clases son void, aunque en realidad, un método puede devolver cualquier cosa, desde un puntero, una referencia, un entero, otro objeto, etc. Vosotros decidís que queréis que haga vuestra clase. En el siguiente capítulo os enseñaré a sobrecargar operadores y a enlazar clases con otras, vamos, la asociación, composición y la agregación.