Compartir a través de


Clases basadas en plantillas

Nota:

La biblioteca Microsoft Foundation Classes (MFC) sigue siendo compatible. Sin embargo, ya no estamos agregando características ni actualizando la documentación.

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 de la que se deriva, que debe ser una de las colecciones de punteros que no son plantilla 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 la 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 mapa 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 la colección Typed-Pointer

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

Typed-Pointer Uso de Matrices y Listas

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 declaras 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 varias funciones y operadores miembro adicionales que garantizan la seguridad de tipos al encapsular 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 tipados myArray, derivada de CObArray. La matriz almacena y devuelve punteros a CPerson objetos (donde CPerson es una clase derivada de CObject). Puede llamar a cualquier función miembro CObArray, o puede llamar a las nuevas funciones seguras para tipos GetAt y ElementAt, o usar el operador seguro para tipos [ ].

En el segundo ejemplo se declara una lista de punteros con tipo myList, derivada de CPtrList. La lista almacena y retorna punteros a MY_STRUCT objetos. Se usa una clase basada en CPtrList para almacenar punteros a objetos no derivados de CObject. CTypedPtrList tiene una serie de funciones miembro con seguridad de tipos: GetHead, GetTail, RemoveHead, RemoveTail, GetNext, GetPrev y GetAt.

Uso de asignaciones de puntero con tipo

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 una asignación basada en CMapPtrToPtr : usa claves CString asignadas a punteros a MY_STRUCT. Puede buscar un puntero almacenado llamando a una función miembro Lookup con seguridad de tipos. Puede usar el operador [ ] para buscar un puntero almacenado y agregarlo si no se encuentra. Además, puede iterar la asignación mediante la función GetNextAssoc con seguridad de 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 de objetos CMyObject. Puede usar los mismos miembros con seguridad de tipos descritos en el párrafo anterior o puede llamar a miembros de la clase CMapStringToOb.

Nota:

Si especifica un tipo class 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