[TUTORIAL] Programación orientada a objetos con C++

Por favor, no copiéis este tutorial sin autorización mía. ¡Gracias!
ATENCIÓN: Este tutorial, al igual que su autor, es propenso a tener errores. ¡Avisadme y los corrijo, hamijos!

Éste tutorial intenta ser una continuación del tutorial iniciado por blipi en el hilo hilo_tutorial-programando-en-c_1546639. Recomiendo su lectura y comprensión ya que es necesario una serie de conocimientos para poder seguir éste tutorial. Espero que éste tutorial sea una buena referencia para que os animéis a aprender. Un saludo a todos.

Capítulo 1: Y... ¿qué es eso de la programación orientada a objetos?

C es un lenguaje diseñado en el año 1972 por Ritchie (blah, blah, blah). Poco a poco la programación aumentaba su complejidad, y para ello se creó la Programación Orientada a Objetos (a partir de ahora OOP). No quiero aburriros como empiezan todos los libros hablando de conceptos como herencia o encapsulación, porque soy consciente de que no serviría de nada hablar de cosas que no se conocen (¿¡Por qué todos los libros se empeñan en hacerlo!?). Vamos a explicar la OOP en la vida real:

Términos que necesitamos conocer (Introducción Gráfica):
1.  El objeto:

Imagen
Aquí tenemos dos objetos. La frutería Pepe, y mi coche (o el coche de @Adelaiglesia). Éstos son dos objetos que utilizo en mi vida diaria. Cada objeto tiene su identidad. ¡Nadie confundiría mi Coche con la frutería Pepe!.

2.  La clase:

El objeto mi coche pertenece a la clase coche. El coche de Bill Gates, aunque cuesta mucho más que el mío, también pertenece a la clase coche.
Imagen
3.  Los atributos:

Como hemos visto arriba, a pesar de que mi coche y el de Bill Gates pertenecen a la clase coche, el suyo es MUUUUCHO más caro. ¿Y por qué? El secreto está en sus atributos. Mirad:

Velocidad máxima:
Mi coche: 115 en sus mejores tiempos
El coche de Bill Gates: 330 y subiendo

Pintura:
Mi coche: Verde descuartizado
El coche de Bill Gates: Negro metalizado

Aceleración:
Mi coche: 3 km/h a los 100 segundos
El coche de Bill Gates: 3 segundos a los 100 km/h

Equipamiento:
Mi coche: Rueda de repuesto
El coche de Bill Gates: Ordenador de a bordo, GPS, televisión FULL HD, Asientos calefactados, circulito para el vaso...

Caja:
Mi coche: Caja flamenca, por el ruido que hace al meter la marcha
El coche de Bill Gates: 6 velocidades automáticas con relación de marcha personalizable

4.  Los métodos (o mensajes):
Aunque el coche de Bill Gates sea mucho mejor que el mío, podemos manejarlo mediante los mismos métodos. Éstos métodos son el método acelerar, frenar, girarDerecha, girarIzquierda... ¡Si un día me toca el euromillón y me compro un coche como el de Bill Gates sabré manejarlo porque es de la misma clase que mi coche! A esto se le conoce cómo abstracción. Ésto significa que a nosotros como usuarios de la clase (del coche) no nos importa lo más minimo como demonios hace el coche para acelerar, si no que lo que queremos es que al apretar el acelerador el vehículo avance, y eso sirve para cualquier coche. Ésta es una de las principales ventajas de la Programación Orientada a Objetos.

Otro punto importante es que los métodos son únicos de su clase. Es decir, cualquier objeto coche comprenderá el metodo acelera. Pero si intentamos que la Frutería Pepe realize el metodo acelera, nos encontraremos con que el objeto frutería no comprende ése metodo:

Imagen

A la frutería Pepe podremos enviarle otros mensajes (métodos), que serán damePeras(5), dameManzanas(8), tePago... Como también ocurre con la clase coche a nosotros no nos importa como han llegado las peras a la frutería Pepe. ¡De eso ya se encarga la clase frutería! Cuando vamos a la frutería Pepe a por manzanas ¡Nunca se nos ha ocurrido pensar como han llegado hasta allí! Esa es la base de la programación orientada a objetos. Aunque nos podemos hacer una idea:

Imagen

¡Esto tiene ventajas! Si algún día Pepe encuentra unas manzanas mas ricas en un sitio diferente (fruteria Pepe ha mejorado su codigo), ¡Nosotros podremos pedirle manzanas igualmente, aunque las obtenga de otra manera o de otro sitio! Así aunque el procedimiento de obtener manzanas cambie, el mensaje seguirá siendo el mismo, Pepe lo entenedrá y nos dará Manzanas. ¡Además nos damos cuenta de que Pepe ha utilizado la clase coche para ir a recojer las manzanas, concretamente el objeto el coche de Pepe, y sus metodos acelerar, frenar, girarIzquierda, ...

Actividades propuestas:
1. Piensa en tu coche y en el coche de algún vecino o familiar. ¿Qué atributos los diferencian?
2. ¿Qué métodos podría tener una Televisión? ¿Y qué atributos diferencian tu TV de otras?


Anexo I: C++ y sus diferencias con C

Ya es hora de dejarnos de tantas fruterías y coches y ponernos manos a la obra. Observemos los siguientes códigos:
Imagen

#include <stdio.h> vs #include <iostream>: Son las bibliotecas de C y de C++ de flujo de entrada y salida, es decir, las que se comunican con el sistema operativo para recojer datos del teclado y mostrarlos por la pantalla. La diferencia es que <stdio.h> no está orientada a objetos y <iostream> si, así que la utilizaremos a partir de ahora. ¿Que por qué? En mi tierra hay un refrán que dice "Donde fueres, haz lo que vieres" así que si estás aprendiendo a programar en C++ utiliza <iostream>.

printf("Hola Mundo"); vs std::cout << "Hola mundo" << endl; : El primero es una función de C en stdio.h y el segundo es un metodo de la clase std que utiliza el operador de inserción de flujo. Lo utilizaremos habitualmente, así que observaremos algunos ejemplos:

Mostrar una cadena:
std::cout << "Cadena de texto aqui" << endl;

Muestra: Cadena de texto aqui

Mostrar una variable:
int a = 5;
std::cout << a << endl;

Muestra: 5

Mostrar una cadena con una variable (o varias):
int a = 5, b = 7;
std::cout << "A vale " << a << " y b vale << b << endl;

Muestra: A vale 5 y b vale 7

Así vemos que podemos encadenar todo lo que queramos mediante el operador de inserción de flujo, y cuando pongamos endl saltará de línea, aunque podemos seguir utilizando dentro de las cadenas "\n" y demás modificadores.
Igual que existe el operador de inserción de flujo (<<) existe el operador de extracción de flujo (>>) que es el equivalente a scanf("%d", &num); . Así:

scanf("%d", &num); se escribe std::cin >> num; Vemos:

Leer un numero de cualquier tipo:
int a;
std::cin >> a ;

Si introducimos 5, a = 5.

float a;
std::cin >> a ;

Si introducimos 5, a = 5.0, por ser de coma flotante simple.

Leer una cadena:
Utilizaremos la biblioteca string:
#include <iostream>
#include <string>

(...)

std::string a;
std::cin >> a ;

Si introducimos "Esto es una cadena", a = "Eso es una cadena".

getchar() vs std::cin.get(): Volvemos a lo mismo, getchar es una función de C y get es un método de la clase cin, que a su vez pertenece al namespace std. No os preocupéis si no cogéis bien los términos, más adelante iremos profundizando en cada uno y no quedará ninguna duda.


Actividades propuestas:
1. Haz un programa que lea dos números del teclado con la biblioteca <iostream> y que los muestre por pantalla sumados.
2. Haz un programa que lea una cadena del teclado y la muestre por pantalla.


Using namespace std:

Como habréis podido obserbar delante de cin y cout ponemos continuamente std::. Nos estamos refiriendo a donde esta cin y cout. Como observamos es muy repetitivo. Si colocamos debajo de las instrucciones del preprocesador using namespace std; le estaremos diciendo al linker que apartir de ahora todo lo que no encuentre o no sepa donde está lo busque dentro del namespace std. Vamos que lo ponemos para ahorrarnos escribir std:: a cada rato. Obserbad:

Imagen


Capítulo 2: La clase

A partir de aquí el vocabulario que utilizaremos será más relacionado con la programación orientada a objetos. Empecemos definiendo como se programa una clase:

class nombredelaclase {
public:
atributos ó metodos publicos;
private:
atributos ó metodos privados;
};

Veamos nuestra primera clase de ejemplo: La clase fracción, que representará una fracción matemática. ¿Qué atributos tiene una fracción matemática? Pues un denominador y un numerador. Más adelante veremos los métodos que pueda tener:

Imagen

¿Y por que lo metemos en private? Por el concepto de encapsulación. No queremos que nadie desde fuera pueda tocar nuestro numerador o nuestro denominador sin nuestro permiso. ¡Imaginate que alguien mete un 0 en el denominador! ¡Produciría un error a la hora de dividir y se nos iria todo al carajo! Como observaréis he metido la clase fracción dentro de un archivo llamado fracción.h, que irá separado de nuestro main. Vamos a crear el main para que tengamos un programa que se pueda ejecutar:

Imagen

Al ejecutar la consola muestra una bonita apariencia negra. Si observáis hemos creado un objeto de la clase fracción, concretamente el objeto unafraccion. Vamos a hacer algunos métodos para empezar a interactuar con la clase:

Imagen
Imagen

Observemos lo que hemos hecho: Dentor de la definición de la clase escribiremos el prototipo del método, y fuera de la misma escribiremos la implementación. Si os fijáis, la implementación lleva delante del nombre del método el nombre de la clase seguida de :: (operador de ámbito). Pues bien, esto es lo que le indica al compilador que el metodo corresponde a esa clase. Así escribiremos tipo clasealaquepertenece::metodo(argumento1, ...) {

En el main solamente hemos hecho un par de cout con las llamadas a los metodos que acabamos de crear, para como nos devuelven los valores de la fracción. Veamos que ocurre al compilar y ejecutar:

Imagen

Nota: Según el compilador pueden aparecer valores totalmente aleatorios ó 0. En el caso de g++ que es el que yo utilizo, aparece 0. Veremos ahora qué hacer para que nuestros objetos se inicialicen con lo que nosotros queramos:

El constructor
El constructor es un método que sirve para inicializar los atributos de una clase al valor que se quiera cuando ésta es creada. Los constructores son un tanto especiales, por varios motivos:
  • Tienen el mismo nombre que la clase a la que pertenecen
  • No retornan ningún valor
  • Deben ser públicos siempre. No tiene sentido un constructor privado


Y ahora os preguntaréis, ¿Y por qué hacer un constructor?. Para mantener nuestra clase consistente. Cuando se programa una clase es importante que desde su creación hasta su destrucción sea consistente, es decir, que no ocasione errores ni estados no posibles. Nuestra clase fracción es inconsistente en éste momento porque tiene un denominador 0, y si construimos un método que devuelva la división de los dos atributos, provocará un error. Con el constructor inicializaremos nuestra clase a 1 de la siguiente manera:
Imagen
Observemos las peculiaridades antes comentadas. No devuelve ningún tipo de datos (ni int, ni void ni ná), no recoge parámetros (tiene los paréntesis en blanco) y tiene el mismo nombre que la clase. Ahora la ejecución muestra 1 y 1, tal y como declara el constructor:
Imagen
Así pues cada vez que creemos un objeto de la clase fracción sus atributos.
excelente mi hermano gracias ojala y saques las siguientes partes del tuto y asi esta perfecto como lo explicas en mi caso asi con manzanitas le agarro mejor la onda. [sonrisa] [sonrisa] [sonrisa]
Excelente colega, asi, me da más que gusto leer tutoriales de programación XD . Muy bueno.

Salu2 !
Imagen
Es muy ameno e ilustartivo jejeje
salu2 [oki]
genial!! muchisimas gracias por tu tiempo. Agregado a favoritos!

Seguro que me servirá ;)
Ya mismo pincho en "valorar positivamente" y a marcadores.
Si yo fuera juez de las olimpiadas, tú te llevarias la de oro.
MIS FELICITACIONES POR ESTE POST! SI QUIERES QUE TE APOYE AYUDANDOTE A HACER ALGO PUEDES CONTAR CONMIGO

Me parece una gran iniciativa y sobretodo lo del coche y la fruteria es una muy buena forma de ver la programacion orientada a objetos.
Programacion en c++: media-alta/alta

Edito: Yo meteria tambien lo de protected y nombrarlo pro encima. =)

Ejercicios propuestos por ellidr:
Imagen
/**
* Ejercicio 1:
*   Divide dos numeros y comprueba que el denominador
*   no sea 0 para que no de error.
*/

#include <iostream>
using namespace std;

int main ()
{
   int numerador, denominador, resultado; // Declaramos las variables
   
   cout << "Dame dos numeros para dividirlos" << endl;
   cout << "Numerador: ";
   cin >> numerador;
   
   cout << "Denominador: ";
   cin >> denominador;
   
   if (denominador != 0) // Comprobamos que NO sea igual a 0 (el igual es  ==)
   {
      resultado = numerador/denominador; // (Este igual es de asignacion no de comparacion)
      cout << resultado << endl;
   }
   else
      cout << "ERROR: no se puede dividir entre 0" << endl;
   
   SYSTEM("PAUSE"); //SI LO EJECUTAS EN LINUX ESTE COMANDO NO HACE FALTA
   return 0;
}
y esto que tiene que ver con la escene de PS3 ??
narkoplus escribió:y esto que tiene que ver con la escene de PS3 ??


Pues mas que tu respuesta
narkoplus escribió:y esto que tiene que ver con la escene de PS3 ??

Hay no seas m........ :-|
@Ellidr: Buen aporte!! Yo se programar pero en C no en C++, me motiva la scene a aprender este lenguaje!! je, talvez y realizo algun jueguesillo pronto!!
Saludos!!!
Para quien quiera hacer el ejercico que propone nuestro amigom la solucion esta aqui:
hilo_tutorial-programacion-orientada-a-objetos-con-c_1617110#p1724947993
No utiliceis el system("PAUSE"). Es una manía muy mala, y que es mejor quitarse cuanto antes... Hacer una llamada al sistema para pausar el programa es algo poco eficiente, y además no es estandar.
Acermax escribió:No utiliceis el system("PAUSE"). Es una manía muy mala, y que es mejor quitarse cuanto antes... Hacer una llamada al sistema para pausar el programa es algo poco eficiente, y además no es estandar.


Esta claro que hacer una llamada al sistema es poco eficiente pero es mejor empezar poco a poco, ahora lo que nos interesa es aprender no hacer un programa lo mas eficiente que podamos, luego nos meteremos con la optimizacion. Esta claro que si tengo que optimizar el programa, se podia haber hecho mas a un sin llegar a utilizar 3 variables.

Yo ya no programo en windows, lo hago todo desde linux desde kate pero si lo porto a windows no voy a utilizar system("PAUSE"); hay mas cosas a parte de eso pero de momento es la mas clara e intuitiva y no cin.get() el cual la gente se queda diciendo que? xD
No estoy hablando como tal de optimizar el programa, si no de no pillar malas costumbres. Para pausar un programa puedes usar getchar(), y listo.
Hola:

Muy bueno, sólo falta al menos por donde bajar un compilador. En este caso se usa el gratuito Visual C++ express 2010 (también vale el 2008).

Pueden descargarlo por aquí.
http://www.microsoft.com/express/Downlo ... Visual-CPP

Es bueno ponerlo en el primer post el enlace de la descarga.

Saludo.
Acermax escribió:No estoy hablando como tal de optimizar el programa, si no de no pillar malas costumbres. Para pausar un programa puedes usar getchar(), y listo.

¿Y esa mala costumbre por que?
Lo que digo, hacer una llamada al sistema para "pausar" un programa es una mala costumbre, como hay muchas otras (urilizar la libreria conio.h para lo mismo, pausar), declarar el main como void, no comprobar el tamaño del buffer destino etc...

Como digo, son costumbres que es mejor no pillar desde el principio, aquí hay un enlace con algunas cosas básicas que no se deben hacer en C/C++ http://foro.elhacker.net/programacion_c ... 729.0.html
Acermax escribió:Lo que digo, hacer una llamada al sistema para "pausar" un programa es una mala costumbre, como hay muchas otras (urilizar la libreria conio.h para lo mismo, pausar), declarar el main como void, no comprobar el tamaño del buffer destino etc...

Como digo, son costumbres que es mejor no pillar desde el principio, aquí hay un enlace con algunas cosas básicas que no se deben hacer en C/C++ http://foro.elhacker.net/programacion_c ... 729.0.html


He visto a profesores de Programación en facultades de informática enseñar a deshacerse del input con fflush(stdin) !!!!! [boing]
Voy a darle un poco al tutorial.
Koolk escribió:Hola:

Muy bueno, sólo falta al menos por donde bajar un compilador. En este caso se usa el gratuito Visual C++ express 2010 (también vale el 2008).

Pueden descargarlo por aquí.
http://www.microsoft.com/express/Downlo ... Visual-CPP

Es bueno ponerlo en el primer post el enlace de la descarga.

Saludo.


Si es para Windows les aconsejo Eclipse C/C++
Joooooooooooooooooo, ya era hora de algo así y tan bien explicado, te lo has currado [oki]

Está bien para programar para PS3 y para programar para Bada, ya que todo lo que saca Samsung es mierda XD

Compiladores los hay a patadas, yo llevo un tiempo usando Dev-C++ y no va nada mal. Y hasta con NetBeans se pueden hacer estas cosas, solo que como aún no estoy en ello no lo he configurado.
Hola:

Si quieres aprender bien para novatos, este libro es uno de ellos y vale la pena.

Imagen

http://anayamultimedia.es/cgigeneral/fi ... al=2335386

Saludo.
Que pena que las personas que visitan este foro presten tan poca atención a hilos como este...
Pero bueno... de igual manera te agradezco por tomarte el tiempo de postear semejante tutorial, gracias.
a ver si me pongo y empiezo ya, por cierto una pregunta:

si no sabes ni C ni C++, cual se debería aprender (por tener más salida y con el que más cosas pueda hacer...)?
Gennio escribió:a ver si me pongo y empiezo ya, por cierto una pregunta:

si no sabes ni C ni C++, cual se debería aprender (por tener más salida y con el que más cosas pueda hacer...)?


yo te digo que en primero de ingenieria informatica di c++ por encima y no toque nada de c porque c++ es como una extension de c con sintaxis muy parecida, un lenguaje orientada a objetos, por lo tanto puedes hacer clases como las que te explica nuestro compañero Adelaiglesia. Eso no quiere decir que sabiendo c++ sepas c, llevas camino recorrido pero no es completamente igua.
Yo te aconsejo c++ =)
Buen aporte. Deberían fijarlo con una chincheta.

Un saludo
jjaaa he de decir que me a gustao el ejemplo y la explicacion..xDDDD en si el programa no es muy complejo precisamente pero es un buen programilla para empezar. pero seria mas dibertido si creases un objeto coche ..y contruyeses paso por paso el de billgates y el tuyo con erencia jaaa mas avanzado si pero mas dibertido y son 10 mints
Koolk escribió:Hola:

Si quieres aprender bien para novatos, este libro es uno de ellos y vale la pena.

Imagen

http://anayamultimedia.es/cgigeneral/fi ... al=2335386

Saludo.


¿Un libro tecnico de anaya bueno? ES EL FIN DEL MUNDOOOOOOOOO!!!!!11!!oneone!!!!!!!

En serio yo tengo de html de css de vb6 de javascript de vb.net todos de anaya y son todos una mierda. PERO ASI DE CLARO. Por detras vienen categorizados por orden de dificultad.

El de vb2005 pone nivel medio avanzado y esta lleno de capturas de pantalla para enseñarte a hacer siguiente siguiente siguiente en un asistente.

Comprate libros de macgraw hill que aunque son un poco mas chungos al principio les sacas mucha mas chicha y sobre todo te enseñan bien los conceptos cosa que los de anaya no hacen.
Up

Ponedle la chincheta para que no baje
Vrsquid escribió:¿Un libro tecnico de anaya bueno? ES EL FIN DEL MUNDOOOOOOOOO!!!!!11!!oneone!!!!!!!

En serio yo tengo de html de css de vb6 de javascript de vb.net todos de anaya y son todos una mierda. PERO ASI DE CLARO. Por detras vienen categorizados por orden de dificultad.

El de vb2005 pone nivel medio avanzado y esta lleno de capturas de pantalla para enseñarte a hacer siguiente siguiente siguiente en un asistente.

Comprate libros de macgraw hill que aunque son un poco mas chungos al principio les sacas mucha mas chicha y sobre todo te enseñan bien los conceptos cosa que los de anaya no hacen.


Totalmente de acuerdo. Tengo un libro de anaya sobre GNU/Linux y es un c/p del glosario de comandos. Sin embargo tengo uno de Mcgraw Hill sobre programación gráfica en C y C++, que a pesar de que ya es antiguo, está muy bien detallado y enseña conceptos muy interesantes sobre esa materia.

Un saludo
Espero con ansias las siguientes lecciones ;)
Genial @Adelaiglesia. Me ha gustado bastante (a pesar de que ya conozco la teoría xD). Muy ameno, y ejemplos claros! Buen trabajo ^^
Vrsquid escribió:
Koolk escribió:Hola:

Si quieres aprender bien para novatos, este libro es uno de ellos y vale la pena.

Imagen

http://anayamultimedia.es/cgigeneral/fi ... al=2335386

Saludo.


¿Un libro tecnico de anaya bueno? ES EL FIN DEL MUNDOOOOOOOOO!!!!!11!!oneone!!!!!!!

En serio yo tengo de html de css de vb6 de javascript de vb.net todos de anaya y son todos una mierda. PERO ASI DE CLARO. Por detras vienen categorizados por orden de dificultad.

El de vb2005 pone nivel medio avanzado y esta lleno de capturas de pantalla para enseñarte a hacer siguiente siguiente siguiente en un asistente.

Comprate libros de macgraw hill que aunque son un poco mas chungos al principio les sacas mucha mas chicha y sobre todo te enseñan bien los conceptos cosa que los de anaya no hacen.


Tengo muchos libros ed Anaya y no todooooooooooooos son una mierda. Mucho si, todos no, lo de programación los buenos no son estos. Esos libros de Anaya son baratos y es para empezar, cuando ya sepas algo, te centras en libros buenísimos como macgraw hill que tienes toda la razón. Libros técnicos los mejores considerados son Ra-Ma también.

Hay libros de Anaya muy decepcionante cuando compré Visual C# 2005, no aprendes nada de nada y no he comprado más libros de Anaya. otros libros como Flash y AutoCad, eso si salieron buenos, pero de programación es pésimo.

Si quieres ya puedes escoger libros de macgraw hill para ver los que hay.
Otro hilo sacado de un scener de Dh.*** o sea blipi, ya me imagino que el egolatra (ya sabemos quien) estara echando pestes. :-|
Con lo que disfruta borrar las cuentas de todo aquel que no le siga como oveja (ya sabemos quien). XD
Espero que su CFW sea la polla por que si no... [360º]

PD: Veo que blipi creo el otro hilo, supongo que mientras blipi le sirva a sus propositos, el Pobre (ya sabemos quien) no puede hacer nada. :o
@blade133bo
Nunca he hechado pestes de eol, y al reves, me paso y ayudo a gente de aqui. Pero cuando se reciben estos ataques sin ton ni son a uno se le quitan las ganas.

Este tutorial nada tiene que ver con DHorg y menos conmigo. Se hizo porque se pensó que era oportuno para que aprendierais (vosotros) a programar, ni mas ni menos, al igual que mi post de C.

Si tan malo es intentar ayudar, pido disculpas. Por lo que veo lo que se recibe a cambio de ayudar es ser llamado ególatra.. lo que hay que ver...
Y borrar cuentas? O_o peroo que dicees mujer!? (frase de apm)
blipi escribió:@blade133bo
Nunca he hechado pestes de eol, y al reves, me paso y ayudo a gente de aqui. Pero cuando se reciben estos ataques sin ton ni son a uno se le quitan las ganas.

Este tutorial nada tiene que ver con DHorg y menos conmigo. Se hizo porque se pensó que era oportuno para que aprendierais (vosotros) a programar, ni mas ni menos, al igual que mi post de C.

Si tan malo es intentar ayudar, pido disculpas. Por lo que veo lo que se recibe a cambio de ayudar es ser llamado ególatra.. lo que hay que ver...
Y borrar cuentas? O_o peroo que dicees mujer!? (frase de apm)


Ehhh soy varoncito chaval, y por lo egolatra me referia al que sabemos, a ese que borra cuentas en Dh.org si uno se atreve a tener personalidad propia e ideas claras, que a el solo le gusta una comunidad de ovejas donde se le alabe de todo y de nada. :-|
Bueno te felicito por el curso que muchos lo aprovecharan, perdon por no poner muy claro a quien me referia con mi comentario.
Un saludo.
35 respuestas