Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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 518 — #556<br />
✐<br />
Capítulo 16. Introducción a las Plantillas<br />
uso de vector <strong>en</strong> este ejemplo.<br />
Además nos gustaría que drawAll() fuera un algoritmo g<strong>en</strong>érico, para que los<br />
cont<strong>en</strong>edores pudieran ser de cualquier tipo y que no se tuviera que escribir una<br />
nueva versión del algoritmo para cada tipo difer<strong>en</strong>te del cont<strong>en</strong>edor. Aquí es donde<br />
las plantillas de funciones son es<strong>en</strong>ciales, porque automáticam<strong>en</strong>te g<strong>en</strong>eran el código<br />
específico para cada tipo de cont<strong>en</strong>edor difer<strong>en</strong>te. Pero sin la indirección extra<br />
proporcionada por los iteradores, estas g<strong>en</strong>eralizaciones no serían posibles. Este es<br />
el motivo por el que los iteradores son importantes; nos permit<strong>en</strong> escribir código de<br />
propósito g<strong>en</strong>eral que involucra a cont<strong>en</strong>edores sin conocer la estructura subyac<strong>en</strong>te<br />
del cont<strong>en</strong>edor. (Note que los iteradores de <strong>C++</strong> y los algoritmos g<strong>en</strong>éricos requier<strong>en</strong><br />
plantillas de funciones).<br />
Se puede ver el alcance de esto <strong>en</strong> el main(), ya que drawAll() funciona sin<br />
cambiar cada uno de los difer<strong>en</strong>tes tipos de cont<strong>en</strong>edores. E incluso más interesante,<br />
drawAll() también funciona con punteros al principio y al final del array sarray.<br />
Esta habilidad para tratar arrays como cont<strong>en</strong>edores está integrada <strong>en</strong> el diseño<br />
de la Librería Estándar de <strong>C++</strong>, cuyos algoritmos se parec<strong>en</strong> mucho a drawAll().<br />
Debido a que las plantillas de clases cont<strong>en</strong>edoras están raram<strong>en</strong>te sujetas a la<br />
her<strong>en</strong>cia y al upcast se v<strong>en</strong> como clases «ordinarias», casi nunca se verán funciones<br />
virtuales <strong>en</strong> clases cont<strong>en</strong>edoras. La reutilización de las clases cont<strong>en</strong>edoras está<br />
implem<strong>en</strong>tado mediante plantillas, no mediante her<strong>en</strong>cia.<br />
16.9. Resum<strong>en</strong><br />
Las clases cont<strong>en</strong>edoras son una parte es<strong>en</strong>cial de la programación ori<strong>en</strong>tada a<br />
objetos. Son otro modo de simplificar y ocultar los detalles de un programa y de<br />
acelerar el proceso de desarrollo del programa. Además, proporcionan un gran nivel<br />
de seguridad y flexibilidad reemplazando los anticuados arrays y las relativam<strong>en</strong>te<br />
toscas técnicas de estructuras que se pued<strong>en</strong> <strong>en</strong>contrar <strong>en</strong> C.<br />
Como el programador cli<strong>en</strong>te necesita cont<strong>en</strong>edores, es es<strong>en</strong>cial que sean fáciles<br />
de usar. Aquí es donde <strong>en</strong>tran los templates. Con las plantillas la sintaxis para el<br />
reciclaje del código fu<strong>en</strong>te (al contrario del reciclaje del código objeto que proporciona<br />
la her<strong>en</strong>cia y la composición) se vuelve lo sufici<strong>en</strong>tem<strong>en</strong>te trivial para el usuario<br />
novel. De hecho, la reutilización de código con plantillas es notablem<strong>en</strong>te más fácil<br />
que la her<strong>en</strong>cia y el polimorfismo.<br />
Aunque se ha apr<strong>en</strong>dido cómo crear cont<strong>en</strong>edores y clases iteradoras <strong>en</strong> este libro,<br />
<strong>en</strong> la práctica es mucho más útil apr<strong>en</strong>der los cont<strong>en</strong>edores e iteradores que<br />
conti<strong>en</strong>e la Librería Estándar de <strong>C++</strong>, ya que se puede esperar <strong>en</strong>contrarlas <strong>en</strong> cualquier<br />
compilador. Como se verá <strong>en</strong> el Volum<strong>en</strong> 2 de este libro (que se puede bajar<br />
de www.BruceEckel.com, los cont<strong>en</strong>edores y algoritmos de la STL colmarán virtualm<strong>en</strong>te<br />
sus necesidades por lo que no t<strong>en</strong>drá que crear otras nuevas.<br />
Las características que implica el diseño con clases cont<strong>en</strong>edoras han sido introducidas<br />
a lo largo de todo el capítulo, pero hay que resaltar que van mucho más<br />
allá. Una librería de clases cont<strong>en</strong>edoras más complicada debería cubrir todo tipo<br />
de características adicionales, como la multitarea, la persist<strong>en</strong>cia y la recolección de<br />
basura.<br />
518<br />
✐<br />
✐<br />
✐<br />
✐