¿Cómo desarrollar una plantilla de clase en c ++
Plantillas de clase realizan el trabajo pesado de los tipos de plantilla. Se utiliza una plantilla de clase para definir objetos de casi cualquier tamaño. En la mayoría de los casos, se utilizan clases para representar objetos complejos o para realizar tareas acordes mal para las plantillas de función o estructura.
Usted normalmente clases de código en un archivo separado utilizando el nombre de la clase como nombre de archivo. La definición de la clase aparece en un archivo de cabecera, mientras que el código aparece en un archivo de código. Para hacer las cosas un poco más fácil de entender, este ejemplo evita la configuración normal y muestra todo el ejemplo utilizando un único archivo.
El ejemplo muestra una aplicación especializada cola. Incluye muchas de las características de una cola estándar y luego añade algunas características para satisfacer las necesidades especiales de desarrollo. Colas y otros recipientes tienden a contener código complejo, pero también tienen que usarlos con una variedad de tipos de datos, por lo que una plantilla de clase de la aplicación perfecta. los ClassTemplate ejemplo muestra el código para este ejemplo.
#include#include using namespace std-plantilla clase MyQueue {protected: Vector datos pública: void Add (T const entrada) -void Eliminar () - vacío printString () - vacío PrintInt () - bool IsEmpty () -} - Plantilla void MyQueue :: Añadir (T const entrada) {data.push_back (entrada) -} plantilla void MyQueue :: Eliminar () {data.erase (data.begin ()) -} plantilla void MyQueue :: PrintString () {vectorial :: iterator PrintIt = data.begin () -, mientras que (PrintIt = data.end ()!) {cout lt; lt; *Imprímelo lt; lt; endl-PrintIt ++ -}} plantilla void MyQueue :: PrintInt () {vector :: iterator PrintIt = data.begin () -, mientras que (PrintIt = data.end ()!) {cout lt; lt; *Imprímelo lt; lt; endl-PrintIt ++ -}} plantilla MyQueue bool :: IsEmpty () {return data.begin () == data.end () -} int main () {MyQueue StringQueue-cout lt; lt; StringQueue.IsEmpty () lt; lt; endl-StringQueue.Add ("Hola") - StringQueue.Add ("Goodbye") - cout lt; lt; "Cuerdas" de impresión: lt; lt; endl-StringQueue.PrintString () - cout lt; lt; StringQueue.IsEmpty () lt; lt; endl-StringQueue.Remove () - cout lt; lt; "Cuerdas" de impresión: lt; lt; endl-StringQueue.PrintString () - StringQueue.Remove () - cout lt; lt; StringQueue.IsEmpty () lt; lt; endl-MyQueue IntQueue-IntQueue.Add (1) -IntQueue.Add (2) -cout lt; lt; "Ints impresión:" lt; lt; endl-IntQueue.PrintInt () - retorno 0-}
El ejemplo comienza con la clase MyQueue. Tenga en cuenta que datos es un vector, no es un cola como se podría esperar. LA cola es un adaptador - como tal, no proporciona soporte para muchas de las características que se encuentran en recipientes, tales como vector - uno de los cuales es el uso de iteradores.
En este ejemplo se utiliza un iterador para la impresión, por lo que se basa en una vector, en lugar de una cola como punto de partida. Siempre que usted crea su propia versión especializada de una construcción común, asegúrese de comenzar con el objeto correcto. De lo contrario, puede encontrarse con la experiencia de la creación de la nueva clase frustrante como mínimo, imposible en el peor de los casos.
MyQueue incluye la capacidad de añadir, eliminar y elementos de impresión. Además, usted puede comprobar si una cola está vacía o llena. Usted ya ha visto el código para estas tareas en otras partes del libro.
Usted podría preguntarse sobre el código utilizado para la impresión. El ejemplo incluye métodos distintos para las cadenas de impresión y enteros, lo que podría parecer contrario a la intuición. Después de todo, ¿por qué no simplemente declarar el iterador de la siguiente manera para que acepte cualquier tipo de datos:
vector:: iterator PrintIt = data.begin () -
El problema es que el iterador requiere un tipo de datos específico. En consecuencia, debe declararlo como se muestra. De lo contrario, usted recibe este mensaje de error inútil:
error: se esperaba '-' antes 'PrintIt'
En algún momento, que desea probar esta nueva clase utilizando pasos similares a los encontrados en main (). La prueba verifica si la cola en realidad no detectan los estados vacíos y llenos, cómo funciona la adición y eliminación de elementos, y si las rutinas de impresión funcionan. Aquí está la salida de este ejemplo:
1Printing cadenas: cadenas HelloGoodbye0Printing: ints Goodbye1Printing: 12