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 486 — #524<br />

✐<br />

Capítulo 16. Introducción a las Plantillas<br />

16.3.1. Definiciones de función no inline<br />

Por supuesto, hay veces <strong>en</strong> las que se querrá t<strong>en</strong>er definición de funciones no<br />

inline. En ese caso, el compilador necesita ver la declaración del template antes<br />

que la definición de la función miembro. Aquí está el ejemplo anterior, modificado<br />

para mostrar la definición del miembro no inline.<br />

//: C16:Array2.cpp<br />

// Non-inline template definition<br />

#include "../require.h"<br />

template<br />

class Array {<br />

<strong>en</strong>um { size = 100 };<br />

T A[size];<br />

public:<br />

T& operator[](int index);<br />

};<br />

template<br />

T& Array::operator[](int index) {<br />

require(index >= 0 && index < size,<br />

"Index out of range");<br />

return A[index];<br />

}<br />

int main() {<br />

Array fa;<br />

fa[0] = 1.414;<br />

} ///:~<br />

Cualquier refer<strong>en</strong>cia al nombre de una plantilla de clase debe estar acompañado<br />

por la lista de argum<strong>en</strong>tos del template, como <strong>en</strong> Arrayoperator[]. Se puede<br />

imaginar que internam<strong>en</strong>te, el nombre de la clase se rell<strong>en</strong>a con los argum<strong>en</strong>tos de<br />

la lista de argum<strong>en</strong>tos de la plantilla para producir un nombre id<strong>en</strong>tificador único<br />

de la clase for cada instanciación de la plantilla.<br />

Archivos cabecera<br />

Incluso si se crean definiciones de funciones no inline, normalm<strong>en</strong>te se querrá<br />

poner todas las declaraciones y definiciones de un template <strong>en</strong> un archivo cabecera.<br />

Esto parece violar la regla usual de los archivos cabecera de «No poner nada que<br />

asigne almac<strong>en</strong>ami<strong>en</strong>to», (lo cual previ<strong>en</strong>e múltiples errores de definición <strong>en</strong> tiempo<br />

de <strong>en</strong>lace), pero las definiciones de plantillas son especial. Algo precedido por<br />

template significa que el compilador no asignará almac<strong>en</strong>ami<strong>en</strong>to <strong>en</strong> ese<br />

mom<strong>en</strong>to, sino que se esperará hasta que se lo indiqu<strong>en</strong> (<strong>en</strong> la instanciación de una<br />

plantilla), y que <strong>en</strong> algún lugar del compilador y del <strong>en</strong>lazador hay un mecanismo<br />

para eliminar las múltiples definiciones de una plantilla idéntica. Por lo tanto casi<br />

siempre se pondrá toda la declaración y definición de la plantilla <strong>en</strong> el archivo<br />

cabecera por facilidad de uso.<br />

Hay veces <strong>en</strong> las que puede ser necesario poner las definiciones de la plantilla<br />

<strong>en</strong> un archivo cpp separado para satisfacer necesidades especiales (por ejemplo,<br />

forzar las instanciaciones de las plantillas para que se <strong>en</strong>cu<strong>en</strong>tr<strong>en</strong> <strong>en</strong> un único archivo<br />

dll de Windows). La mayoría de los compiladores ti<strong>en</strong><strong>en</strong> algún mecanismo para<br />

486<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!