Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO Pensar en C++ (Volumen 1) - Grupo ARCO

arco.esi.uclm.es
from arco.esi.uclm.es More from this publisher
13.01.2015 Views

✐ ✐ ✐ “Volumen1” — 2012/1/12 — 13:52 — page 110 — #148 ✐ Capítulo 3. C en C++ procesador, pero hay situaciones en las cuales el compilador debe estar advertido de que está tratando un nombre como si fuese un tipo, y por eso typedef es esencial. int* x, y; Esto genera en realidad un int* que es x, y un int (no un int*) que es y. Esto significa que el * añade a la derecha, no a la izquierda. Pero, si utiliza un typedef: typedef int* IntPtr; IntPtr x, y; Entonces ambos, x e y son del tipo int*. Se puede discutir sobre ello y decir que es más explícito y por consiguiente mas legible evitar typedefs para los tipos primitivos, y de hecho los programas se vuelven difíciles de leer cuando se utilizan demasiados typedefs. De todos modos, los typedefs se vuelven especialmente importantes en C cuando se utilizan con struct. 3.8.2. Usar struct para combinar variables Un struct es una manera de juntar un grupo de variables en una estructura. Cuando se crea un struct, se pueden crear varias instancias de este «nuevo» tipo de variable que ha inventado. Por ejemplo: //: C03:SimpleStruct.cpp struct Structure1 { char c; int i; float f; double d; }; int main() { struct Structure1 s1, s2; s1.c = ’a’; // Select an element using a ’.’ s1.i = 1; s1.f = 3.14; s1.d = 0.00093; s2.c = ’a’; s2.i = 1; s2.f = 3.14; s2.d = 0.00093; } ///:~ La declaración de struct debe acabar con una llave. En main(), se crean dos instancias de Structure1: s1 y s2. Cada una de ellas tiene su versión propia y separada de c, I, f y d. De modo que s1 y s2 representan bloques de variables completamente independientes. Para seleccionar uno de estos elementos dentro de s1 o s2, se utiliza un ., sintaxis que se ha visto en el cápitulo previo cuando se utilizaban objetos class de C++ - ya que las clases surgían de structs, de ahí proviene esta sintaxis. 110 ✐ ✐ ✐ ✐

✐ ✐ ✐ “Volumen1” — 2012/1/12 — 13:52 — page 111 — #149 ✐ 3.8. Creación de tipos compuestos Una cosa a tener en cuenta es la torpeza de usar Structure1 (como salta a la vista, eso sólo se requiere en C, y no en C++). En C, no se puede poner Structure1 cuando se definen variables, se debe poner struct Structure1. Aquí es donde typedef se vuelve especialmente útil en C: //: C03:SimpleStruct2.cpp // Using typedef with struct typedef struct { char c; int i; float f; double d; } Structure2; int main() { Structure2 s1, s2; s1.c = ’a’; s1.i = 1; s1.f = 3.14; s1.d = 0.00093; s2.c = ’a’; s2.i = 1; s2.f = 3.14; s2.d = 0.00093; } ///:~ Usando typedef de este modo, se puede simular (en C; intentar eliminar el t- ypedef para C++) que Structure2 es un tipo predefinido, como int o float, cuando define s1 y s2 (pero se ha de tener en cuenta de que sólo tiene información - características - y no incluye comportamiento, que es lo que se obtiene con objetos reales en C++). Observe que el struct se ha declarado al principio, porque el objetivo es crear el typedef. Sin embargo, hay veces en las que sería necesario referirse a struct durante su definición. En esos casos, se puede repetir el nombre del struct como tal y como typedef. //: C03:SelfReferential.cpp // Allowing a struct to refer to itself typedef struct SelfReferential { int i; SelfReferential* sr; // Head spinning yet } SelfReferential; int main() { SelfReferential sr1, sr2; sr1.sr = &sr2; sr2.sr = &sr1; sr1.i = 47; sr2.i = 1024; } ///:~ Si lo observa detenidamente, puede ver que sr1 y sr2 apuntan el uno al otro, guardando cada uno una parte de la información. 111 ✐ ✐ ✐ ✐

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 110 — #148<br />

✐<br />

Capítulo 3. C <strong>en</strong> <strong>C++</strong><br />

procesador, pero hay situaciones <strong>en</strong> las cuales el compilador debe estar advertido de<br />

que está tratando un nombre como si fuese un tipo, y por eso typedef es es<strong>en</strong>cial.<br />

int* x, y;<br />

Esto g<strong>en</strong>era <strong>en</strong> realidad un int* que es x, y un int (no un int*) que es y. Esto<br />

significa que el * añade a la derecha, no a la izquierda. Pero, si utiliza un typedef:<br />

typedef int* IntPtr;<br />

IntPtr x, y;<br />

Entonces ambos, x e y son del tipo int*.<br />

Se puede discutir sobre ello y decir que es más explícito y por consigui<strong>en</strong>te mas<br />

legible evitar typedefs para los tipos primitivos, y de hecho los programas se vuelv<strong>en</strong><br />

difíciles de leer cuando se utilizan demasiados typedefs. De todos modos, los<br />

typedefs se vuelv<strong>en</strong> especialm<strong>en</strong>te importantes <strong>en</strong> C cuando se utilizan con struct.<br />

3.8.2. Usar struct para combinar variables<br />

Un struct es una manera de juntar un grupo de variables <strong>en</strong> una estructura.<br />

Cuando se crea un struct, se pued<strong>en</strong> crear varias instancias de este «nuevo» tipo<br />

de variable que ha inv<strong>en</strong>tado. Por ejemplo:<br />

//: C03:SimpleStruct.cpp<br />

struct Structure1 {<br />

char c;<br />

int i;<br />

float f;<br />

double d;<br />

};<br />

int main() {<br />

struct Structure1 s1, s2;<br />

s1.c = ’a’; // Select an elem<strong>en</strong>t using a ’.’<br />

s1.i = 1;<br />

s1.f = 3.14;<br />

s1.d = 0.00093;<br />

s2.c = ’a’;<br />

s2.i = 1;<br />

s2.f = 3.14;<br />

s2.d = 0.00093;<br />

} ///:~<br />

La declaración de struct debe acabar con una llave. En main(), se crean dos<br />

instancias de Structure1: s1 y s2. Cada una de ellas ti<strong>en</strong>e su versión propia y separada<br />

de c, I, f y d. De modo que s1 y s2 repres<strong>en</strong>tan bloques de variables completam<strong>en</strong>te<br />

indep<strong>en</strong>di<strong>en</strong>tes. Para seleccionar uno de estos elem<strong>en</strong>tos d<strong>en</strong>tro de s1 o<br />

s2, se utiliza un ., sintaxis que se ha visto <strong>en</strong> el cápitulo previo cuando se utilizaban<br />

objetos class de <strong>C++</strong> - ya que las clases surgían de structs, de ahí provi<strong>en</strong>e esta<br />

sintaxis.<br />

110<br />

✐<br />

✐<br />

✐<br />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!