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 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 />

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

Saved successfully!

Ooh no, something went wrong!