2010-03-22 19 views
6

Tengo este código y estoy tratando de entender la convención seguida, todo el método definido en el archivo .cpp tiene template<class KeyType, class DataType> escrito antes de ellos. Qué significa eso?¿Qué significa la plantilla <class key, class type> mean before a method in C++?

Ejemplo:

//Constructor 
template<class key, class type> 
MyOperation<key, type>::MyOperation() 
{ 
    //method implementation 
} 

//A method 
template<class key, class type> 
MyOperation<key, type>::otherOperation() 
{ 
    //method implementation 
} 

Gracias

+0

Otros han dado buenas respuestas. Simplemente señalaré que en algún lugar de los encabezados estándar de la biblioteca encontrará cosas similares para, por ejemplo, std :: map :: insert - std :: map, std :: set y std :: vector y otros contenedores estándar son todas clases de plantillas. – Steve314

Respuesta

5

Tiene que haber una buena respuesta para esto pero también voy a lanzar la mía a la piscina.

C++ permite que las declaraciones y las implementaciones de las estructuras del programa se realicen por separado. Se deriva de cómo los programadores C/C++ publican nuevas funcionalidades entre sí: los archivos de encabezado se incluyen en unidades de compilación dependientes en lugar de las unidades que dependen de los metadatos presentes en la compilación (como es de esperar si trabajas con C# o Java).

Cada vez que dar el compilador una instrucción si se trata de una declaración ("habrá esta cosa con esta interfaz") o una aplicación ("aquí es esta cosa con esta interfaz y estos comportamientos"), usted tener la oportunidad de adaptar esa directiva.

El hecho de que tenga una opción para hacerlo, en lugar de un requisito para hacerlo, le brinda mucha más flexibilidad de la que le ofrecen los lenguajes más modernos como Java y C#.

Considérese la siguiente plantilla (estoy oxidado así que sea amable con problemas sintácticos mínimos, por favor):

template<typename Junk> 
class IGotJunk { 
private: 
    Junk myJunk_; 
public: 
    void SetJunk(Junk const& source); 
    Junk const& GetJunk() const; 
} 

su aplicación "típico" de dicha plantilla podría incluir estos comportamientos predeterminados:

template<typename Junk> 
void IGotJunk<Junk>::SetJunk(Junk const& source) 
{ 
    myJunk_ = source; 
} 

Sin embargo, para las cadenas, existe el riesgo de que la cadena se modifique después de que se copie el puntero, en cuyo caso, podría proporcionar un comportamiento especializado que asegure que la cadena se copie, en lugar del puntero (nuevamente, ha sido un largo, largo tiempo) ...

void IGotJunk<char*>::SetJunk(char* const& source) 
{ 
    free(myJunk_); 
    myJunk_ = malloc(strlen(source) + 1); 
    strcpy(myJunk_, source); 
} 

Luego podría hacer algo similar para GetJunk(). Esa es probablemente la razón por la que debe declarar los parámetros de plantilla para cada artefacto que cree: porque es posible que no desee que sean los mismos en todos los casos.

3

Esta clase es una clase de plantilla - puede ser parametrizado por tipos. Para crear una instancia de esta clase, que iba a escribir, por ejemplo,

MyOperation<int, int> myop; 

Hay un artículo decente sobre las plantillas de C++ here. Las plantillas son una parte importante de C++ pero tardan mucho tiempo en dominarlas. Una gran parte de la biblioteca estándar de C++ utiliza plantillas (esto se conoce a menudo por su nombre no oficial, el STL). Por ejemplo, vector<T> es una plantilla de tipo T.

0

Sólo significa que en la cabecera se define como clase plantilla de archivo:

template<class key, class type> 
class MyOperation 
{ 
    ... 
}; 

Así que cuando va a implementar métodos en .cpp archivo que necesita para incluir parámetros de plantilla:

template<class key, class type> MyOperation<key, type>:: 

como en:

template<class key, class type> MyOperation<key, type>::otherOperation() { ... } 
1

Le dice al compilador de C++ que lo que sigue a esa declaración está modelado.

Más específicamente, significa que en lo que sigue, las palabras KeyType y DataType son nombres de marcador de posición para algún tipo, que serán evidentes o especificados al llamar al método. En ese punto, el compilador toma la plantilla, sustituye KeyType y DataType en el método basado en lo que sea que use, y compila esa copia.

En el ejemplo de código que muestra, la parte con plantilla es la clase, por lo que es posible que los métodos no los usen, pero C++ necesita poder vincular una implementación genérica del método a la clase siempre es usado.

1

Las plantillas son una forma de hacer que sus clases sean más abstractas al permitirle definir el comportamiento de la clase sin saber realmente qué tipo de datos será manejado por las operaciones de la clase. En esencia, esto es lo que se conoce como programación genérica. Este término es una forma útil de pensar en las plantillas porque ayuda a recordar al programador que una clase con plantilla no depende del tipo de datos (o tipos) con los que trata.

En gran medida, una clase de plantilla se centra más en el pensamiento algorítmico que en los matices específicos de un solo tipo de datos. Las plantillas pueden usarse junto con tipos de datos abstractos para permitirles manejar cualquier tipo de datos.

Por ejemplo, podría crear una clase de pila con plantillas que pueda manejar una pila de cualquier tipo de datos, en lugar de tener que crear una clase de pila para cada tipo de datos diferente para el que quiera que funcione la pila. La capacidad de tener una sola clase que pueda manejar diferentes tipos de datos significa que el código es más fácil de mantener y hace que las clases sean más reutilizables.

+0

Una buena explicación de las plantillas para bagginers, pero no estoy seguro si esto realmente responde la pregunta de OPs – thecoshman