Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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 />
✐