13.01.2015 Views

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

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

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

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

✐<br />

✐<br />

✐<br />

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

✐<br />

Capítulo 4. Abstracción de Datos<br />

Como textlines se ll<strong>en</strong>a, el cont<strong>en</strong>ido de line se «clona» para cada push-<br />

() creando un new string(line). El valor devuelto por la expresión new es un<br />

puntero al nuevo string que fue creado y al que se ha copiado la información de la<br />

line. Si se hubiera pasado directam<strong>en</strong>te la dirección de line a push(), la Stack<br />

se ll<strong>en</strong>aría con direcciones idénticas, todas apuntando a line. Más adelante <strong>en</strong> ese<br />

libro apr<strong>en</strong>derá más sobre este proceso de «clonación».<br />

El nombre del fichero se toma de línea de comando. Para garantizar que hay sufici<strong>en</strong>tes<br />

argum<strong>en</strong>tos <strong>en</strong> la línea de comando, se usa una segunda función del fichero<br />

de cabecera require.h: requireArgs() que compara argc con el número de argum<strong>en</strong>tos<br />

deseado e imprime un m<strong>en</strong>saje de error y termina el programa si no hay<br />

sufici<strong>en</strong>tes argum<strong>en</strong>tos.<br />

4.8.1. Resolución de ámbito global<br />

El operador de resolución de ámbito puede ayudar <strong>en</strong> situaciones <strong>en</strong> las que el<br />

nombre elegido por el compilador (el nombre «más cercano») no es el que se quiere.<br />

Por ejemplo, suponga que ti<strong>en</strong>e una estructura con un id<strong>en</strong>tificador local a, y quiere<br />

seleccionar un id<strong>en</strong>tificador global a desde d<strong>en</strong>tro de un método. El compilador,<br />

por defecto, elegirá el local, de modo que es necesario decirle que haga otra cosa.<br />

Cuando se quiere especificar un nombre global usando la resolución de ámbito, debe<br />

usar el operador sin poner nada delante de él. A continuación aparece un ejemplo<br />

que muestra la resolución de ámbito global tanto para una variable como para una<br />

función:<br />

//: C04:Scoperes.cpp<br />

// Global scope resolution<br />

int a;<br />

void f() {}<br />

struct S {<br />

int a;<br />

void f();<br />

};<br />

void S::f() {<br />

::f(); // Would be recursive otherwise!<br />

::a++; // Select the global a<br />

a--; // The a at struct scope<br />

}<br />

int main() { S s; f(); } ///:~<br />

Sin resolución de ámbito <strong>en</strong> S::f(), el compilador elegiría por defecto las versiones<br />

miembro para f() y a.<br />

4.9. Resum<strong>en</strong><br />

166<br />

En este capítulo, ha apr<strong>en</strong>dido lo fundam<strong>en</strong>tal de <strong>C++</strong>: que puede poner funciones<br />

d<strong>en</strong>tro de las estructuras. Este nuevo tipo de estructura se llama tipo abstracto de<br />

dato, y las variables que se crean usando esta estructura se llaman objetos, o instancias,<br />

de ese tipo. Invocar un método de una objeto se d<strong>en</strong>omina <strong>en</strong>viar un m<strong>en</strong>saje al<br />

objeto. La actividad principal <strong>en</strong> la programación ori<strong>en</strong>tada a objetos es el <strong>en</strong>vío de<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!