Compartir a través de


clases de Template-Based

En este artículo se explican las clases de colección basadas en plantillas con seguridad de tipos en MFC versión 3.0 y posteriores. El uso de estas plantillas para crear colecciones seguras para tipos es más conveniente y ayuda a proporcionar seguridad de tipos de forma más eficaz que el uso de las clases de colección que no se basan en plantillas.

MFC predefinía dos categorías de colecciones basadas en plantillas:

Las clases de colección simples se derivan de la clase CObject, por lo que heredan la serialización, la creación dinámica y otras propiedades de CObject. Las clases de colección de punteros con tipo requieren que especifique la clase a la que deriva, que debe ser una de las colecciones de punteros nontemplate predefinidas por MFC, como CPtrList o CPtrArray. La nueva clase de colección hereda de la clase base especificada y las funciones miembro de la nueva clase usan llamadas encapsuladas a los miembros de clase base para aplicar la seguridad de tipos.

Para obtener más información sobre las plantillas de C++, vea Plantillas en la referencia del lenguaje C++.

Uso de plantillas de matriz, lista y asignación simples

Para usar las plantillas de recopilación simples, debe saber qué tipo de datos puede almacenar en estas colecciones y qué parámetros usar en las declaraciones de colección.

Uso simple de matriz y lista

Las clases de lista y matriz simples, CArray y CList, toman dos parámetros: TYPE y ARG_TYPE. Estas clases pueden almacenar cualquier tipo de datos, que especifique en el parámetro TYPE :

  • Tipos de datos fundamentales de C++, como int, chary float

  • Estructuras y clases de C++

  • Otros tipos que defina

Para mayor comodidad y eficacia, puede usar el parámetro ARG_TYPE para especificar el tipo de argumentos de función. Normalmente, se especifica ARG_TYPE como referencia al tipo denominado en el parámetro TYPE . Por ejemplo:

CArray<int, int> myArray;
CList<CPerson, CPerson &> myList;

En el primer ejemplo se declara una colección de matrices, myArray, que contiene **int**s. En el segundo ejemplo se declara una colección de listas, myList, que almacena CPerson objetos. Algunas funciones miembro de las clases de colección toman argumentos cuyo tipo especifica el parámetro de plantilla ARG_TYPE . Por ejemplo, la Add función miembro de la clase CArray toma un argumento ARG_TYPE :

CArray<CPerson, CPerson &> personArr;
CPerson person;
personArr.Add(person);

Uso de mapa simple

La clase de mapa simple, CMap, toma cuatro parámetros: KEY, ARG_KEY, VALUE y ARG_VALUE. Al igual que las clases de matriz y lista, las clases de mapa pueden almacenar cualquier tipo de datos. A diferencia de las matrices y las listas, que indexan y ordenan los datos que almacenan, asigna las claves y los valores asociados: tiene acceso a un valor almacenado en un mapa especificando la clave asociada del valor. El parámetro KEY especifica el tipo de datos de las claves usadas para acceder a los datos almacenados en el mapa. Si el tipo de KEY es una estructura o clase, el parámetro ARG_KEY suele ser una referencia al tipo especificado en KEY. El parámetro VALUE especifica el tipo de los elementos almacenados en el mapa. Si el tipo de ARG_VALUE es una estructura o clase, el parámetro ARG_VALUE suele ser una referencia al tipo especificado en VALUE. Por ejemplo:

CMap<int, int, MY_STRUCT, MY_STRUCT &> myMap1;
CMap<CString, LPCTSTR, CPerson, CPerson &> myMap2;

En el primer ejemplo se almacenan MY_STRUCT valores, se accede a ellos mediante int claves y se devuelven los elementos a los que se accede MY_STRUCT por referencia. En el segundo ejemplo se almacenan CPerson valores, se accede a ellos mediante CString claves y se devuelven referencias a los elementos a los que se tiene acceso. Este ejemplo podría representar una libreta de direcciones simple, en la que se buscan personas por apellidos.

Dado que el parámetro KEY es de tipo CString y el parámetro KEY_TYPE es de tipo LPCSTR, las claves se almacenan en el mapa como elementos de tipo CString , pero se hace referencia a ellas en funciones como SetAt a través de punteros de tipo LPCSTR. Por ejemplo:

CMap<CString, LPCTSTR, CPerson, CPerson &> myMap;
CPerson person;
LPCTSTR lpstrName = _T("Jones");
myMap.SetAt(lpstrName, person);

Uso de plantillas de colección de Typed-Pointer

Para usar las plantillas de colección de punteros tipados, debe saber qué tipos de datos puede almacenar en estas colecciones y qué parámetros usar en las declaraciones de colección.

Typed-Pointer matriz y uso de lista

Las clases typed-pointer y list, CTypedPtrArray y CTypedPtrList, toman dos parámetros: BASE_CLASS y TYPE. Estas clases pueden almacenar cualquier tipo de datos, que especifique en el parámetro TYPE . Se derivan de una de las clases de colección nontemplate que almacena punteros; especifique esta clase base en BASE_CLASS. En el caso de las matrices, use CObArray o CPtrArray. Para las listas, use CObList o CPtrList.

En efecto, cuando se declara una colección basada en , por ejemplo CObList, la nueva clase no solo hereda los miembros de su clase base, sino que también declara una serie de funciones y operadores miembros seguros para tipos adicionales que ayudan a proporcionar seguridad de tipos mediante la encapsulación de llamadas a los miembros de la clase base. Estas encapsulaciones administran todas las conversiones de tipos necesarias. Por ejemplo:

CTypedPtrArray<CObArray, CPerson *> myArray;
CTypedPtrList<CPtrList, MY_STRUCT *> myList;

En el primer ejemplo se declara una matriz de punteros con tipo, , myArrayderivada de CObArray. La matriz almacena y devuelve punteros a CPerson objetos (donde CPerson es una clase derivada de CObject). Puede llamar a cualquier CObArray función miembro o puede llamar a las nuevas funciones y ElementAt seguras GetAt para tipos o usar el operador type-safe [ ] .

En el segundo ejemplo se declara una lista de punteros con tipo, , myListderivada de CPtrList. La lista almacena y devuelve punteros a MY_STRUCT objetos . Se usa una clase basada en CPtrList para almacenar punteros a objetos no derivados de CObject. CTypedPtrListtiene una serie de funciones miembro seguras de tipos: GetHead, GetTail, RemoveHeadRemoveTail, GetNext, , GetPrevy GetAt.

uso de mapa de Typed-Pointer

La clase de asignación de puntero con tipo, CTypedPtrMap, toma tres parámetros: BASE_CLASS, KEY y VALUE. El parámetro BASE_CLASS especifica la clase desde la que se deriva la nueva clase: CMapPtrToWord, , CMapPtrToPtrCMapStringToPtr, CMapWordToPtr, CMapStringToOb, etc. KEY es análogo a KEY en CMap: especifica el tipo de la clave usada para las búsquedas. VALUE es análogo a VALUE en CMap: especifica el tipo de objeto almacenado en el mapa. Por ejemplo:

CTypedPtrMap<CMapPtrToPtr, CString, MY_STRUCT*> myPtrMap;
CTypedPtrMap<CMapStringToOb, CString, CPerson*> myPersonMap;

El primer ejemplo es un mapa basado en CMapPtrToPtr : usa CString claves asignadas a punteros a MY_STRUCT. Puede buscar un puntero almacenado llamando a una función miembro segura para Lookup tipos. Puede usar el operador [ ] para buscar un puntero almacenado y agregarlo si no se encuentra. Además, puede iterar el mapa mediante la función segura GetNextAssoc para tipos. También puede llamar a otras funciones miembro de la clase CMapPtrToPtr.

El segundo ejemplo es un mapa basado en CMapStringToOb : usa claves de cadena asignadas a punteros almacenados a CMyObject objetos. Puede usar los mismos miembros seguros de tipos descritos en el párrafo anterior o puede llamar a miembros de la clase CMapStringToOb.

Nota:

Si especifica un class tipo o struct para el parámetro VALUE , en lugar de un puntero o referencia al tipo, la clase o estructura debe tener un constructor de copia.

Para obtener más información, vea How to Make a Type-Safe Collection.

Consulte también

Colecciones