Share via


Cómo: Cree una colección de tipo

En este artículo se explica cómo crear las colecciones con seguridad de tipos para sus propios tipos de datos.Entre los temas se incluyen los siguientes:

  • Mediante las clases basadas en plantillas para la seguridad de tipos

  • Implementar funciones auxiliares

  • Utilizar clases de colección de segunda

La biblioteca Microsoft Foundation Class proporciona colecciones con seguridad de tipos predefinidas basadas en las plantillas de C++.Porque son plantillas, la ayuda de estas clases proporcionan seguridad de tipos y facilidad de uso sin la porque no es necesario y otro trabajo adicional que surgen al utilizar una clase que no es de plantilla con este fin.El ejemplo GET de MFC ilustra el uso de clases de colección basadas en plantillas en una aplicación MFC.Utilice normalmente estas clases siempre que escribir nuevo código de colecciones.

Mediante las clases basadas en plantillas para la seguridad de tipos

Para utilizar clases basadas en plantillas

  1. Declare una variable de tipo de clase de colección.Por ejemplo:

    CList<int, int> m_intList;
    
  2. Llama a las funciones miembro del objeto de colección.Por ejemplo:

    m_intList.AddTail(100);
    m_intList.RemoveAll();
    
  3. En caso necesario, implemente funciones auxiliares y SerializeElements.Para obtener información sobre la implementación de estas funciones, vea Implementar funciones auxiliares.

En este ejemplo se muestra la declaración de una lista de enteros.El primer parámetro del paso 1 es el tipo de datos almacenados como elementos de la lista.El segundo parámetro especifica a cómo se van pasado y volver de las funciones miembro de clases de colección, como agregar y GetAt.

Implementar funciones auxiliares

Las clases de colección basadas en plantillas CArray, CList, y funciones globales auxiliares de uso cinco de CMap que puede personalizar según sea necesario para la clase de colección derivada.Para obtener información sobre estas funciones auxiliares, vea aplicaciones auxiliares de la clase de colección en la referencia de MFC.La implementación de la función de la serialización es necesaria para la mayoría usos de las clases de colección basadas en plantillas.

6s70zdb8.collapse_all(es-es,VS.110).gifSerialización de elementos

CArray, CList, y las clases de CMap llama SerializeElements para guardar elementos de la colección a o para leer de un archivo.

La implementación predeterminada de la función auxiliar de SerializeElements realiza una escritura bit a bit de los objetos al archivo, o una lectura bit a bit del archivo a los objetos, dependiendo de si los objetos se están almacenando en o se recupera del archivo.Reemplace SerializeElements si esta acción no es adecuado.

Si su colección almacena objetos derivados de CObject y utilice la macro de IMPLEMENT_SERIAL en la implementación de la clase de elemento de la colección, puede aprovechar la funcionalidad de serialización compilada en CArchive y CObject:

CArray< CPerson, CPerson& > personArray;

template <> void AFXAPI SerializeElements <CPerson> (CArchive& ar, 
   CPerson* pNewPersons, INT_PTR nCount)
{
   for (int i = 0; i < nCount; i++, pNewPersons++)
   {
      // Serialize each CPerson object
      pNewPersons->Serialize(ar);
   }
}

Los operadores sobrecargados de inserción para CArchive llama CObject::Serialize (o un reemplazo de esa función) para cada objeto de CPerson .

Mediante las clases de colección de Segunda

MFC también admite las clases de colección introducidas con la versión 1,0 de MFC.Estas clases no se basan en las plantillas.Se pueden utilizar para contener datos de los tipos admitidos CObject*, UINT, DWORD, y CString.Puede utilizar estas colecciones predefinidas (como CObList) para contener colecciones de cualquier objeto derivadas de CObject.MFC también ofrece otras colecciones predefinidas para detener tipos primitivos como UINT y punteros vacíos (void*).Sin embargo, en general es a menudo útil definir sus propias colecciones con seguridad de tipos para contener objetos de una clase más específica y sus derivados.Observe que lo hace con las clases de colección no basadas en las plantillas es más trabajo que utilizar las clases basadas en plantillas.

Hay dos maneras de crear colecciones con seguridad de tipos con colecciones de segunda:

  1. Usar las colecciones que no es de plantilla, con la conversión escrito en caso necesario.Este es el método más fácil.

  2. Derive de y extender una colección de tipo que no es de plantilla.

Para utilizar las colecciones que no es de plantilla con la conversión de tipo

  • Utilice una de las clases de segunda, como CWordArray, directamente.

    Por ejemplo, puede crear CWordArray y agregar cualquier valor de 32 bits a, después se recupera.No hay nada más hacer.Simplemente utiliza la funcionalidad predefinida.

    También puede utilizar una colección predefinida, como CObList, para almacenar cualquier objeto derivado de CObject.Una colección de CObList es definido contener punteros a CObject.Cuando se recupera un objeto de lista, puede que tenga que convertir el resultado al tipo adecuado como las funciones de CObList devuelven punteros a CObject.Por ejemplo, si almacena los objetos de CPerson en una colección de CObList , tiene que convertir un elemento recuperado para ser un puntero a un objeto de CPerson .El ejemplo siguiente utiliza una colección de CObList para contener los objetos de CPerson :

    CPerson* p1 = new CPerson();
    CObList myList;
    
    myList.AddHead(p1);   // No cast needed
    CPerson* p2 = (CPerson*)myList.GetHead();
    

    Esta técnica de utilizar un tipo de colección predefinido y release según sea necesario puede ser adecuada para muchas de la colección.Si necesita funcionalidad adicional o más seguridad de tipos, utilice una clase con o, siga el procedimiento siguiente.

Para derivar y extender una colección de tipo que no es de plantilla

  • Derive su propia clase de colección a partir de una de las clases predefinidas que no es de plantilla.

    Al derivar la clase, puede agregar funciones de contenedor diseñó para proporcionar una interfaz seguro a funciones existentes.

    Por ejemplo, si ha derivado una lista de CObList para contener los objetos de CPerson , puede agregar funciones de contenedor AddHeadPerson y GetHeadPerson, como se muestra a continuación.

    class CPersonList : public CObList
    {
    public:
        void AddHeadPerson( CPerson* person )
            {AddHead( person );}
    
        const CPerson* GetHeadPerson()
            {return (CPerson*)GetHead();}
    };
    

    Estas invocaciones de funciones proporcionan un modo seguro de agregar y recuperar los objetos de CPerson de lista derivada.Puede ver que para la función de GetHeadPerson , se encapsulan simplemente la conversión de tipos.

    También puede agregar nueva funcionalidad definiendo las nuevas funciones que amplían las funciones de colección en lugar de simplemente ajustando la funcionalidad existente en contenedores thunk.Por ejemplo, el caso Eliminar objetos Todo en una colección de CObject describe una función para eliminar todos los objetos incluidos en una lista.Esta función se puede agregar a la clase derivada como función miembro.

Vea también

Conceptos

Colecciones