|
|
|
|
2
|
|
2
|
|
3
|
#Utilizando objetos en C++ - Pájaros
|
3
|
#Utilizando objetos en C++ - Pájaros
|
4
|
|
4
|
|
5
|
-<div align='center'><img src="http://i.imgur.com/9D8D7wH.png" width="215" height="174"> <img src="http://i.imgur.com/2zwymir.png?1" width="215" height="174"> <img src="http://demo05.cloudimage.io/s/resize/300/i.imgur.com/A5UVBHd.png" width="215" height="174"></div>
|
|
|
|
|
5
|
+
|
|
|
6
|
+
|
|
|
7
|
+![](images/headerBirds.png)
|
6
|
|
8
|
|
7
|
<p> </p>
|
9
|
<p> </p>
|
8
|
|
10
|
|
9
|
[version 2016.02.09]
|
11
|
[version 2016.02.09]
|
10
|
|
12
|
|
11
|
-Hasta ahora hemos visto cómo utilizar variables para guardar y manipular datos de cierto tipo y cómo estructurar nuestros programas dividiendo las tareas en funciones. Un *objeto* es una entidad que se utiliza en muchos lenguajes de programación para integrar los datos y el código que opera en ellos, haciendo más fácil el modificar programas grandes. En la experiencia de laboratorio de hoy utilizarás una clase llamada `Bird` para practicar algunas de las destrezas básicas en C++ para la creación y manejo de objetos.
|
|
|
|
|
13
|
+Hasta ahora hemos visto cómo utilizar variables para guardar y manipular datos de cierto tipo y cómo estructurar nuestros programas dividiendo las tareas en funciones. Un *objeto* es una entidad que se utiliza en muchos lenguajes de programación para integrar los datos y el código que opera en ellos, haciendo más fácil el modificar programas grandes. En la experiencia de laboratorio de hoy utilizarás una clase llamada `Bird` para practicar algunas de las destrezas básicas en C++ para la creación y manejo de objetos.
|
12
|
|
14
|
|
13
|
##Objetivos:
|
15
|
##Objetivos:
|
14
|
|
16
|
|
|
|
|
|
54
|
|
56
|
|
55
|
###Clases
|
57
|
###Clases
|
56
|
|
58
|
|
57
|
-Una clase es una plantilla para la creación de objetos que establece sus atributos y su comportamiento. Si no se especifica lo contrario, los atributos y métodos definidos en una clase serán "privados". Esto quiere decir que esas variables solo se pueden acceder y cambiar por los métodos de la clase (*constructores*, *"setters"* y *"getters"*, entre otros).
|
|
|
|
|
59
|
+Una clase es una plantilla para la creación de objetos que establece sus atributos y su comportamiento. Si no se especifica lo contrario, los atributos y métodos definidos en una clase serán "privados". Esto quiere decir que esas variables solo se pueden acceder y cambiar por los métodos de la clase (*constructores*, *"setters"* y *"getters"*, entre otros).
|
58
|
|
60
|
|
59
|
Lo siguiente es el esqueleto de la declaración de una clase:
|
61
|
Lo siguiente es el esqueleto de la declaración de una clase:
|
60
|
|
62
|
|
|
|
|
|
66
|
// Declaraciones
|
68
|
// Declaraciones
|
67
|
|
69
|
|
68
|
private:
|
70
|
private:
|
69
|
- // Declaraciones de variables o atributos y
|
|
|
70
|
- // prototipos de métodos
|
|
|
|
|
71
|
+ // Declaraciones de variables o atributos y
|
|
|
72
|
+ // prototipos de métodos
|
71
|
// que sean privados para esta clase
|
73
|
// que sean privados para esta clase
|
72
|
|
74
|
|
73
|
tipo varPrivada;
|
75
|
tipo varPrivada;
|
74
|
tipo nombreMetodoPrivado(tipo de los parámetros);
|
76
|
tipo nombreMetodoPrivado(tipo de los parámetros);
|
75
|
|
77
|
|
76
|
public:
|
78
|
public:
|
77
|
- // Declaraciones de atributos y
|
|
|
78
|
- // prototipos de métodos
|
|
|
|
|
79
|
+ // Declaraciones de atributos y
|
|
|
80
|
+ // prototipos de métodos
|
79
|
// que sean públicos para todo el programa
|
81
|
// que sean públicos para todo el programa
|
80
|
|
82
|
|
81
|
tipo varPública;
|
83
|
tipo varPública;
|
|
|
|
|
96
|
|
98
|
|
97
|
###Métodos de una clase
|
99
|
###Métodos de una clase
|
98
|
|
100
|
|
99
|
-Los métodos de una clase determinan qué acciones podemos tomar sobre los objetos de esa clase. Los métodos son parecidos a las funciones en el sentido de que pueden recibir parámetros y regresar un resultado. Una forma elemental de conocer los métodos de una clase es leyendo la declaración de la clase. Por ejemplo, lo siguiente es parte de la declaración de la clase `Bird` en el archivo `bird.h`.
|
|
|
|
|
101
|
+Los métodos de una clase determinan qué acciones podemos tomar sobre los objetos de esa clase. Los métodos son parecidos a las funciones en el sentido de que pueden recibir parámetros y regresar un resultado. Una forma elemental de conocer los métodos de una clase es leyendo la declaración de la clase. Por ejemplo, lo siguiente es parte de la declaración de la clase `Bird` en el archivo `bird.h`.
|
100
|
|
102
|
|
101
|
---
|
103
|
---
|
102
|
|
104
|
|
|
|
|
|
109
|
//...
|
111
|
//...
|
110
|
|
112
|
|
111
|
Bird(int , EyeBrowType , QString , QString, QWidget *parent = 0) ;
|
113
|
Bird(int , EyeBrowType , QString , QString, QWidget *parent = 0) ;
|
112
|
-
|
|
|
|
|
114
|
+
|
113
|
int getSize() const;
|
115
|
int getSize() const;
|
114
|
EyeBrowType getEyebrow() const ;
|
116
|
EyeBrowType getEyebrow() const ;
|
115
|
QString getFaceColor() const;
|
117
|
QString getFaceColor() const;
|
|
|
|
|
148
|
|
150
|
|
149
|
####Constructores
|
151
|
####Constructores
|
150
|
|
152
|
|
151
|
-Los primeros métodos de una clase que debemos entender son los *constructores*.Una clase puede tener múltiples constructores. Uno de los constructores será invocado automáticamente cada vez que se crea un objeto de esa clase. En la mayoría de los casos, los constructores se utilizan para inicializar los valores de los atributos del objeto. Para poder crear objetos de una clase, debemos conocer cuáles son sus constructores.
|
|
|
|
|
153
|
+Los primeros métodos de una clase que debemos entender son los *constructores*.Una clase puede tener múltiples constructores. Uno de los constructores será invocado automáticamente cada vez que se crea un objeto de esa clase. En la mayoría de los casos, los constructores se utilizan para inicializar los valores de los atributos del objeto. Para poder crear objetos de una clase, debemos conocer cuáles son sus constructores.
|
152
|
|
154
|
|
153
|
En C++, los constructores tienen el mismo nombre que la clase. No se declara el tipo que devuelven porque estas funciones no devuelven ningún valor. Su declaración (incluida en la definición de la clase) es algo así:
|
155
|
En C++, los constructores tienen el mismo nombre que la clase. No se declara el tipo que devuelven porque estas funciones no devuelven ningún valor. Su declaración (incluida en la definición de la clase) es algo así:
|
154
|
|
156
|
|
|
|
|
|
164
|
|
166
|
|
165
|
`Bird (int, EyeBrowType, QString, QString, QWidget *parent=0)`
|
167
|
`Bird (int, EyeBrowType, QString, QString, QWidget *parent=0)`
|
166
|
|
168
|
|
167
|
-Puedes ver las declaraciones de los prototipos de estos métodos en la declaración de la clase `Bird` en el archivo `bird.h` del proyecto. La documentación de la clase se encuentra dentro de la documentación del proyecto (`eip/objetcs-birds/doc/es/html/class_bird.html`). El primer constructor, `Bird (QWidget *parent=0)`, es un método que se puede invocar con uno o ningún argumento. Si al invocarlo no se usa argumento, el parámetro de la función toma el valor 0.
|
|
|
|
|
169
|
+Puedes ver las declaraciones de los prototipos de estos métodos en la declaración de la clase `Bird` en el archivo `bird.h` del proyecto. La documentación de la clase se encuentra dentro de la documentación del proyecto (`eip/objetcs-birds/doc/es/html/class_bird.html`). El primer constructor, `Bird (QWidget *parent=0)`, es un método que se puede invocar con uno o ningún argumento. Si al invocarlo no se usa argumento, el parámetro de la función toma el valor 0.
|
168
|
|
170
|
|
169
|
El constructor de una clase que se puede invocar sin usar argumentos es el *constructor* "*default*" de la clase; esto es, el constructor que se invoca cuando creamos un objeto usando una instrucción como:
|
171
|
El constructor de una clase que se puede invocar sin usar argumentos es el *constructor* "*default*" de la clase; esto es, el constructor que se invoca cuando creamos un objeto usando una instrucción como:
|
170
|
|
172
|
|
|
|
|
|
181
|
|
183
|
|
182
|
Las clases proveen métodos para modificar los valores de los atributos de un objeto que se ha creado. Estos métodos se llaman "*setters*" o "*mutators*". Usualmente se declara un "setter" por cada atributo que tiene la clase. La clase `Bird` tiene los siguientes "setters":
|
184
|
Las clases proveen métodos para modificar los valores de los atributos de un objeto que se ha creado. Estos métodos se llaman "*setters*" o "*mutators*". Usualmente se declara un "setter" por cada atributo que tiene la clase. La clase `Bird` tiene los siguientes "setters":
|
183
|
|
185
|
|
184
|
-* `void setSize (int)`
|
|
|
185
|
-* `void setEyebrow (EyeBrowType)`
|
|
|
186
|
-* `void setFaceColor (QString)`
|
|
|
187
|
-* `void setEyeColor (QString)`
|
|
|
|
|
186
|
+* `void setSize (int)`
|
|
|
187
|
+* `void setEyebrow (EyeBrowType)`
|
|
|
188
|
+* `void setFaceColor (QString)`
|
|
|
189
|
+* `void setEyeColor (QString)`
|
188
|
|
190
|
|
189
|
|
191
|
|
190
|
Puedes ver las declaraciones de los métodos en la Figura 1 y en la declaración de la clase `Bird` en `bird.h`, y la implementación de algunos de los métodos en `bird.cpp`. El código en el siguiente ejemplo crea el objeto `bobo` de la clase `Bird` y luego cambia su tamaño a 333.
|
192
|
Puedes ver las declaraciones de los métodos en la Figura 1 y en la declaración de la clase `Bird` en `bird.h`, y la implementación de algunos de los métodos en `bird.cpp`. El código en el siguiente ejemplo crea el objeto `bobo` de la clase `Bird` y luego cambia su tamaño a 333.
|
|
|
|
|
199
|
|
201
|
|
200
|
Las clases también proveen métodos para acceder ("get") el valor del atributo de un objeto. Estos métodos se llaman "*getters*" o "*accessors*". Usualmente se declara un "getter" por cada atributo que tiene la clase. La clase `Bird` tiene los siguientes "getters":
|
202
|
Las clases también proveen métodos para acceder ("get") el valor del atributo de un objeto. Estos métodos se llaman "*getters*" o "*accessors*". Usualmente se declara un "getter" por cada atributo que tiene la clase. La clase `Bird` tiene los siguientes "getters":
|
201
|
|
203
|
|
202
|
-* `int getSize ()`
|
|
|
203
|
-* `EyeBrowType getEyebrow ()`
|
|
|
|
|
204
|
+* `int getSize ()`
|
|
|
205
|
+* `EyeBrowType getEyebrow ()`
|
204
|
* `QString getFaceColor ()`
|
206
|
* `QString getFaceColor ()`
|
205
|
-* `QString getEyeColor ()`
|
|
|
|
|
207
|
+* `QString getEyeColor ()`
|
206
|
|
208
|
|
207
|
|
209
|
|
208
|
Puedes ver las declaraciones de los métodos en la Figura 1 y en la declaración de la clase `Bird` en `bird.h`, y las implementaciones de algunos de métodos en `bird.cpp`. El código en el siguiente ejemplo crea el objeto `piolin` de la clase `Bird` e imprime su tamaño.
|
210
|
Puedes ver las declaraciones de los métodos en la Figura 1 y en la declaración de la clase `Bird` en `bird.h`, y las implementaciones de algunos de métodos en `bird.cpp`. El código en el siguiente ejemplo crea el objeto `piolin` de la clase `Bird` e imprime su tamaño.
|
|
|
|
|
218
|
|
220
|
|
219
|
`void MainWindow::addBird(int x, int y, Bird &b)`
|
221
|
`void MainWindow::addBird(int x, int y, Bird &b)`
|
220
|
|
222
|
|
221
|
-`void MainWindow::addBird(Bird &b)`
|
|
|
|
|
223
|
+`void MainWindow::addBird(Bird &b)`
|
222
|
|
224
|
|
223
|
que añadirán a la pantalla un dibujo del objeto de la clase `Bird` que es recibido como argumento. El código en el siguiente ejemplo crea un objeto `w` de la clase `MainWindow`, crea un objeto `zumbador` de la clase `Bird` y lo añade a la posición (200,200) de la pantalla `w` usando el primer método.
|
225
|
que añadirán a la pantalla un dibujo del objeto de la clase `Bird` que es recibido como argumento. El código en el siguiente ejemplo crea un objeto `w` de la clase `MainWindow`, crea un objeto `zumbador` de la clase `Bird` y lo añade a la posición (200,200) de la pantalla `w` usando el primer método.
|
224
|
|
226
|
|
|
|
|
|
309
|
|
311
|
|
310
|
**Instrucciones**
|
312
|
**Instrucciones**
|
311
|
|
313
|
|
312
|
-1. Ahora crea un objeto de clase `Bird` llamado `abelardo` usando el constructor default y añádelo a la ventana `w` usando el método `addBird(int x, int y, Bird b)`. Recuerda que la invocación del método debe comenzar con el nombre del objeto `w` y un punto.
|
|
|
|
|
314
|
+1. Ahora crea un objeto de clase `Bird` llamado `abelardo` usando el constructor default y añádelo a la ventana `w` usando el método `addBird(int x, int y, Bird b)`. Recuerda que la invocación del método debe comenzar con el nombre del objeto `w` y un punto.
|
313
|
|
315
|
|
314
|
2. Corre varias veces el programa y maravíllate al ver a `abelardo` tener tamaños, colores y cejas distintas.
|
316
|
2. Corre varias veces el programa y maravíllate al ver a `abelardo` tener tamaños, colores y cejas distintas.
|
315
|
|
317
|
|
|
|
|
|
344
|
|
346
|
|
345
|
---
|
347
|
---
|
346
|
|
348
|
|
347
|
-6. Corre varias veces el programa para asegurarte que `alondra` y `juana` siguen pareciéndose en tamaño, cejas y ojos.
|
|
|
|
|
349
|
+6. Corre varias veces el programa para asegurarte que `alondra` y `juana` siguen pareciéndose en tamaño, cejas y ojos.
|
348
|
|
350
|
|
349
|
|
351
|
|
350
|
---
|
352
|
---
|
|
|
|
|
377
|
|
379
|
|
378
|
[English](#markdown-header-using-objects-in-c-birds) | [Español](#markdown-header-utilizando-objetos-en-c-pajaros)
|
380
|
[English](#markdown-header-using-objects-in-c-birds) | [Español](#markdown-header-utilizando-objetos-en-c-pajaros)
|
379
|
|
381
|
|
380
|
-#Using Objects in C++ - Birds
|
|
|
|
|
382
|
+# Using Objects in C++ - Birds
|
381
|
|
383
|
|
382
|
|
384
|
|
383
|
-<div align='center'><img src="http://i.imgur.com/9D8D7wH.png" width="215" height="174"> <img src="http://i.imgur.com/2zwymir.png?1" width="215" height="174"> <img src="http://demo05.cloudimage.io/s/resize/300/i.imgur.com/A5UVBHd.png" width="215" height="174"></div>
|
|
|
|
|
385
|
+![](images/headerBirds.png)
|
384
|
|
386
|
|
385
|
<p> </p>
|
387
|
<p> </p>
|
386
|
|
388
|
|
|
|
|
|
484
|
//...
|
486
|
//...
|
485
|
|
487
|
|
486
|
Bird(int , EyeBrowType , QString , QString, QWidget *parent = 0) ;
|
488
|
Bird(int , EyeBrowType , QString , QString, QWidget *parent = 0) ;
|
487
|
-
|
|
|
|
|
489
|
+
|
488
|
int getSize() const;
|
490
|
int getSize() const;
|
489
|
EyeBrowType getEyebrow() const ;
|
491
|
EyeBrowType getEyebrow() const ;
|
490
|
QString getFaceColor() const;
|
492
|
QString getFaceColor() const;
|
|
|
|
|
558
|
|
560
|
|
559
|
Classes provide methods to modify the values of the attributes of an objected that has been created. These methods are called *setters* or *mutators*. Usually, we declare one setter for each attribute that the class has. The `Bird` class has the following setters:
|
561
|
Classes provide methods to modify the values of the attributes of an objected that has been created. These methods are called *setters* or *mutators*. Usually, we declare one setter for each attribute that the class has. The `Bird` class has the following setters:
|
560
|
|
562
|
|
561
|
-* `void setSize (int)`
|
|
|
562
|
-* `void setEyebrow (EyeBrowType)`
|
|
|
563
|
-* `void setFaceColor (QString)`
|
|
|
564
|
-* `void setEyeColor (QString)`
|
|
|
|
|
563
|
+* `void setSize (int)`
|
|
|
564
|
+* `void setEyebrow (EyeBrowType)`
|
|
|
565
|
+* `void setFaceColor (QString)`
|
|
|
566
|
+* `void setEyeColor (QString)`
|
565
|
|
567
|
|
566
|
|
568
|
|
567
|
You can see the method's declarations in Figure 1 and in the `Bird` class declaration in `bird.h`, and the implementation of the some of the methods in `bird.cpp`. The code in the following example creates the object `bobo` of the `Bird` class and then changes its size to 333.
|
569
|
You can see the method's declarations in Figure 1 and in the `Bird` class declaration in `bird.h`, and the implementation of the some of the methods in `bird.cpp`. The code in the following example creates the object `bobo` of the `Bird` class and then changes its size to 333.
|
|
|
|
|
575
|
|
577
|
|
576
|
Classes also provide methods to access (get) the value of the attribute of an object. These methods are called *getters* or *accessors*. We usually declare one getter for each attribute a class has. The `Bird` class has the following getters:
|
578
|
Classes also provide methods to access (get) the value of the attribute of an object. These methods are called *getters* or *accessors*. We usually declare one getter for each attribute a class has. The `Bird` class has the following getters:
|
577
|
|
579
|
|
578
|
-* `int getSize ()`
|
|
|
579
|
-* `EyeBrowType getEyebrow ()`
|
|
|
|
|
580
|
+* `int getSize ()`
|
|
|
581
|
+* `EyeBrowType getEyebrow ()`
|
580
|
* `QString getFaceColor ()`
|
582
|
* `QString getFaceColor ()`
|
581
|
-* `QString getEyeColor ()`
|
|
|
|
|
583
|
+* `QString getEyeColor ()`
|
582
|
|
584
|
|
583
|
You can see the declarations of the methods in Figure 1 and in the `Bird` class declaration in `bird.h`, and the implementations of some of the methods in `bird.cpp`. The code in the following example creates the object `piolin` of the `Bird` class and prints its size:
|
585
|
You can see the declarations of the methods in Figure 1 and in the `Bird` class declaration in `bird.h`, and the implementations of some of the methods in `bird.cpp`. The code in the following example creates the object `piolin` of the `Bird` class and prints its size:
|
584
|
|
586
|
|
|
|
|
|
729
|
##References
|
731
|
##References
|
730
|
|
732
|
|
731
|
|
733
|
|
732
|
-https://sites.google.com/a/wellesley.edu/wellesley-cs118-spring13/lectures-labs/lab-2
|
|
|
|
|
734
|
+https://sites.google.com/a/wellesley.edu/wellesley-cs118-spring13/lectures-labs/lab-2
|