Compartir a través de


Clases basadas en plantillas

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

MFC predefine 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 asignación simples

Para usar las plantillas de colecció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 de matrices y listas simples

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, los cuales especificará en el parámetro TYPE:

  • Tipos de datos fundamentales de C++, como int, char y float

  • Estructuras y clases 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 que se ha nombrado 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 los **int**. En el segundo ejemplo se declara una colección de listas, myList, que almacena objetos CPerson. Ciertas funciones miembro de las clases de colección toman argumentos cuyo tipo especifica el parámetro de plantilla ARG_TYPE. Por ejemplo, la función miembro Add de la clase CArray toma un argumento ARG_TYPE:

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

Uso de asignaciones simples

La clase de asignación 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 asignación pueden almacenar cualquier tipo de datos. A diferencia de las matrices y las listas, que indexan y ordenan los datos que almacenan, las asignaciones asocian claves y valores: se obtiene acceso a un valor almacenado en una asignación 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 la asignación. 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 la asignación. 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 los valores MY_STRUCT, se accede a ellos mediante claves int y se devuelven los elementos MY_STRUCT a los que se accede 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. En este ejemplo se puede representar una libreta de direcciones simple, en la que se buscan personas por apellido.

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 la asignación 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 puntero con tipo

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.

Uso de la matriz y la lista de puntero con tipo

Las clases de matriz y lista de puntero con tipo, CTypedPtrArray y CTypedPtrList, toman dos parámetros: BASE_CLASS y TYPE. Estas clases pueden almacenar cualquier tipo de datos, los cuales especificará en el parámetro TYPE. Se derivan de una de las clases de colección que no es de plantilla y que almacena punteros; especifique esta clase base en BASE_CLASS. Para las matrices, utilice CObArray o CPtrArray. Para las listas, utilice 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 miembro y operadores adicionales con seguridad de tipos 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, myArray, derivada de CObArray. La matriz almacena y devuelve punteros a objetos CPerson (donde CPerson es una clase derivada de CObject). Puede llamar a cualquier función miembro CObArray, o puede llamar a las nuevas funciones GetAt y ElementAt con seguridad de tipos o usar el operador [ ] con seguridad de tipos.

En el segundo ejemplo se declara una lista de punteros con tipo, myList, derivada de CPtrList. La lista almacena y devuelve punteros a objetos MY_STRUCT. Se usa una clase basada en CPtrList para almacenar punteros a objetos no derivados de CObject. CTypedPtrListtiene una serie de funciones miembro con seguridad de tipos: GetHead, GetTail, RemoveHead, RemoveTail, GetNext, GetPrevy 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 de la que se va a derivar la nueva clase: CMapPtrToWord, CMapPtrToPtr, CMapStringToPtr, 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 la asignación. 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 una asignación basada en CMapStringToOb: usa claves de cadena asignadas a punteros almacenados a 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 una referencia al tipo, la clase o estructura deben tener un constructor de copia.

Para obtener más información, vea Cómo crear una colección con seguridad de tipos.

Consulte también

Colecciones