Partilhar via


Como: Tornar uma coleção de fortemente tipado

Este artigo explica como criar conjuntos de fortemente tipado para seus próprios tipos de dados.Os tópicos incluem:

  • Usando classes baseado em modelo de segurança de tipos

  • Implementando auxiliar funções

  • Usando classes de coleção nontemplate

A biblioteca de classes do Microsoft Foundation fornece coleções predefinidas de fortemente tipado com base em modelos C++.Como são modelos, essas classes ajudam a fornecer segurança de tipos e facilidade de uso sem a conversão de tipo e Outros trabalho extra envolvido no uso de uma classe nontemplate para essa finalidade.O exemplo MFC COLETAR demonstra o uso de classes de coleção baseado em modelo em um aplicativo MFC.Em geral, use essas classes sempre que você escrever um novo código de coleções.

Usando classes com base em modelo para segurança de tipos

Usar classes de modelo

  1. Declare uma variável do tipo de classe de coleção.Por exemplo:

    CList<int, int> m_intList;
    
  2. O membro chamam funções do objeto da coleção.Por exemplo:

    m_intList.AddTail(100);
    m_intList.RemoveAll();
    
  3. Se necessário, implementar o funções do auxiliar and SerializeElements.Para obter informações sobre a implementação dessas funções, consulte Implementação de funções do auxiliar.

Este exemplo mostra a declaração de uma lista de inteiros.O primeiro parâmetro na etapa 1 é o tipo de dados armazenados sistema autônomo elementos da lista.O segundo parâmetro especifica sistema autônomo sistema autônomo dados a serem passados para e retornados de funções de membro da classe de coleção, sistema autônomo Adicionar and GetAt.

Implementação de funções do auxiliar

O template-bsistema autônomoed coleção clsistema autônomoses CArray, CList, e CMap usar cinco funções do auxiliar global que você pode personalizar sistema autônomo necessários para sua coleção derivada clsistema autônomos. Para obter informações sobre essas funções auxiliares, consulte Coleção classes auxiliares in the Referência da MFC.Implementação da função de serialização é necessária para a maioria dos usos das classes de coleção baseado em modelo.

Serialização de elementos

The CArray, CList, e CMap telefonar de classes SerializeElements para armazenar elementos de coleção ou lê-las de um sistema de arquivar.

A implementação padrão do SerializeElements função auxiliar faz uma gravar de bit a bit dos objetos para o arquivar ou de leitura do arquivar para os objetos, dependendo se os objetos estão sendo armazenados em um bit a bit ou recuperado do arquivar. Substituir SerializeElements Se essa ação não for apropriada.

Se sua coleção armazena objetos derivados de CObject e você usar o IMPLEMENT_SERIAL macro na implementação da classe de elemento da coleção, você pode tirar proveito da funcionalidade de serialização incorporada CArchive e 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);
   }
}

Os operadores sobrecarregados de inserção para CArchive telefonar CObject::Serialize (ou uma substituir dessa função) para cada CPerson objeto.

Usando classes de coleção Nontemplate

MFC também oferece suporte as classes de coleção introduzidas com o MFC versão 1.0.Essas classes não são baseadas em modelos.Eles podem ser usados para conter dados do tipos suportados CObject*, UINT, DWORD, e CString. Você pode usar essas coleções predefinidas (por exemplo, CObList) para Isenção coleções de qualquer objeto derivado de CObject. MFC também oferece outras coleções predefinidas para Isenção tipos primitivos, sistema autônomo UINT e ponteiros void (void*). Em geral, no entanto, geralmente é útil definir suas próprias coleções de fortemente tipado para conter objetos de uma classe mais específica e seus derivativos.Observe que isso com as classes de coleção não baseado em modelos é mais trabalho que o uso de classes baseadas em modelos.

Há duas maneiras de criar conjuntos de fortemente tipado com coleções nontemplate:

  1. Use coleções nontemplate, com tipo de projeção se necessário.Essa é a abordagem mais fácil.

  2. Derivam e estender uma coleção de fortemente tipado nontemplate.

Para usar as coleções nontemplate com conversão de tipo

  • Use um dos clsistema autônomoses nontemplate, tal sistema autônomo CWordArray, diretamente.

    Por exemplo, você pode criar um CWordArray Adicione quaisquer valores de 32 bit a ele e recuperá-los. Não há mais fazer nada.Você simplesmente usar a funcionalidade predefinida.

    Você também pode usar uma coleção predefinida, sistema autônomo CObList, para Isenção qualquer objeto derivado de CObject. A CObList coleção é definida para Isenção ponteiros para CObject. Quando você recupera um objeto da lista, talvez você precise converter o resultado para o tipo apropriado desde o CObList as funções retornam ponteiros para CObject. Por exemplo, se você armazenar CPerson objetos em um CObList coleção, você precisa converter um elemento recuperado para um ponteiro para um CPerson objeto. O exemplo a seguir utiliza um CObList coleção para Isenção CPerson objetos:

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

    Essa técnica de usando um tipo de coleção predefinida e projeção conforme o necessário pode ser adequada para muitas das suas necessidades de coleção.Se você precisar de recursos adicionais ou mais segurança de tipos, use uma classe de modelo ou siga o procedimento seguinte.

Para derivar e estender uma coleção de fortemente tipado nontemplate

  • Derivar sua própria classe de coleção de uma das classes predefinidas nontemplate.

    Ao derivar a classe, você pode adicionar funções de wrapper de fortemente tipado para fornecer uma interface de fortemente tipado para as funções existentes.

    Por exemplo, se deriva uma lista de CObList para manter CPerson objetos, você pode adicionar sistema autônomo funções de wrapper AddHeadPerson e GetHeadPerson, sistema autônomo mostrado abaixo.

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

    Essas funções de wrapper fornecem uma maneira de fortemente tipado adicionar e recuperar CPerson objetos da lista derivado. Você pode ver que o GetHeadPerson função, você simplesmente é encapsulando a conversão de tipo.

    Você também pode adicionar nova funcionalidade definir novas funções que ampliam os recursos da coleção em vez de apenas disposto funcionalidade existente em wrappers de fortemente tipado.Por exemplo, o artigo Excluir todos os objetos em uma coleção CObject descreve uma função para excluir todos os objetos contidos em uma lista.Esta função pôde ser adicionada à classe derivada sistema autônomo uma função de membro.

Consulte também

Conceitos

Coleções