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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

✐<br />

✐<br />

✐<br />

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

✐<br />

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

<strong>en</strong>um { cnt = 4 };<br />

void (Widget::*fptr[cnt])(int) const;<br />

public:<br />

Widget() {<br />

fptr[0] = &Widget::f; // Full spec required<br />

fptr[1] = &Widget::g;<br />

fptr[2] = &Widget::h;<br />

fptr[3] = &Widget::i;<br />

}<br />

void select(int i, int j) {<br />

if(i < 0 || i >= cnt) return;<br />

(this->*fptr[i])(j);<br />

}<br />

int count() { return cnt; }<br />

};<br />

int main() {<br />

Widget w;<br />

for(int i = 0; i < w.count(); i++)<br />

w.select(i, 47);<br />

} ///:~<br />

En la interfaz de la clase y <strong>en</strong> main(), puede observar que toda la implem<strong>en</strong>tación,<br />

funciones incluidas, es privada. El código ha de pedir el count() de las<br />

funciones. De esta manera, el que implem<strong>en</strong>ta la clase puede cambiar la cantidad<br />

de funciones <strong>en</strong> la implem<strong>en</strong>tación por debajo sin que afecte al código que utilice la<br />

clase.<br />

La inicialización de los punteros a miembro <strong>en</strong> el constructor puede parecer redundante.<br />

¿No debería ser capaz de poner<br />

fptr[1] = &g;<br />

porque el nombre g es un método, el cual está <strong>en</strong> el ámbito de la clase El problema<br />

aquí es que no sería conforme a la sintaxis de puntero a miembro. Así todo el<br />

mundo, incluido el compilador, puede imaginarse qué está pasando. De igual forma,<br />

cuando se accede al cont<strong>en</strong>ido del puntero a miembro, parece que<br />

(this->*fptr[i])(j);<br />

también es redundante; this parece redundante. La sintaxis necesita que un<br />

puntero a miembro siempre esté ligado a un objeto cuando se accede al cont<strong>en</strong>ido al<br />

que apunta.<br />

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

Los punteros <strong>en</strong> <strong>C++</strong> son casi idénticos a los punteros <strong>en</strong> C, lo cual es bu<strong>en</strong>o. De<br />

otra manera, gran cantidad de código C no compilaría <strong>en</strong> <strong>C++</strong>. Los únicos errores<br />

<strong>en</strong> tiempo de compilación serán aquéllos que realic<strong>en</strong> asignaciones peligrosas. Esos<br />

errores pued<strong>en</strong> eliminarse con una simple (pero explícito!) molde.<br />

<strong>C++</strong> también añade la refer<strong>en</strong>cia de Algol y Pascal, que es como un puntero constante<br />

que el compilador hace que se acceda directam<strong>en</strong>te al cont<strong>en</strong>ido al que apunta.<br />

327<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!