Partilhar via


Como: tornar uma coleção de tipo seguro

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

  • Usando classes de modelo de segurança do tipo

  • Implementar funções do auxiliar

  • Usando classes de coleção nontemplate

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

Usando Classes de modelo de segurança do tipo

Usar classes de modelo

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

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

    m_intList.AddTail(100);
    m_intList.RemoveAll();
    
  3. Se necessário, implementar a funções auxiliares e SerializeElements.Para informações sobre como implementar essas funções, consulte Implementar 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 como elementos da lista.O segundo parâmetro especifica como os dados são passados para e retornados de funções de membro de classe de coleção, como Add e GetAt.

Implementar funções do auxiliar

As classes de coleção com base no modelo de CArray, CList, e CMap usar cinco funções do auxiliar global que você pode personalizar conforme necessário para sua classe derivada de coleção.Para obter informações sobre essas funções auxiliares, consulte Auxiliares de classe de coleção na Referência MFC.Implementação da função de serialização é necessária para a maioria dos usos das classes de coleção com base em modelo.

6s70zdb8.collapse_all(pt-br,VS.110).gifSerialização elementos

O CArray, CList, e CMap classes chamada SerializeElements para armazenar elementos de coleção ou lê-las de um arquivo.

A implementação padrão de SerializeElements função auxiliar faz uma gravação de bit a bit dos objetos para o arquivamento ou ler do arquivo morto para objetos, dependendo se a objetos são armazenados em um bit a bit ou recuperado do arquivamento.Substituir SerializeElements se essa ação não for apropriada.

Se sua coleção armazena objetos derivados de CObject e usar o IMPLEMENT_SERIAL macro na implementação de classe do elemento da coleção, você pode aproveitar a 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 de inserção sobrecarregado para CArchive chamada CObject::Serialize (ou uma substituição de 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.Pode ser usados para conter dados dos tipos suportados CObject*, UINT, DWORD, e CString.Você pode usar essas coleções predefinidas (como CObList) para armazenar coleções de objetos derivados de CObject.MFC também fornece outras coleções predefinidas para armazenar tipos primitivos, como UINT e anular ponteiros (void*).Em geral, no entanto, geralmente é útil definir suas próprias coleções de tipo seguro para armazenar objetos de uma classe mais específica e seus derivados.Observe que isso com as classes de coleção não baseado em modelos é mais trabalho que usando as classes baseado em modelo.

Há duas maneiras de criar conjuntos de tipo seguro com coleções nontemplate:

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

  2. Derivar e estender uma coleção de tipo seguro nontemplate.

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

  • Use uma das classes de nontemplate, como CWordArray, diretamente.

    Por exemplo, você pode criar um CWordArray e adicionar quaisquer valores de 32 bits e recuperá-las.Não há nada mais a fazer.Você apenas usar a funcionalidade predefinida.

    Você também pode usar uma coleção predefinida, como CObList, para armazenar qualquer objeto derivado de CObject.A CObList coleção é definida para armazenar ponteiros para CObject.Quando você recupera um objeto da lista, talvez você precise converter o resultado para o tipo adequado desde o CObList funções retornam ponteiros para CObject.Por exemplo, se você armazenar CPerson objetos em um CObList coleção, você deve converter um elemento recuperado de um ponteiro para um CPerson objeto.O exemplo a seguir usa um CObList coleção mantenha 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 necessário pode ser adequada para muitas necessidades de coleção.Se precisar de recursos adicionais ou mais segurança de tipo, use uma classe de modelo ou siga o procedimento seguinte.

Para derivar e estender uma coleção de tipo seguro nontemplate

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

    Quando você derivar sua classe, você pode adicionar funções de tipo seguro wrapper para fornecer uma interface de tipo seguro para as funções existentes.

    Por exemplo, se você derivado uma lista de CObList para CPerson objetos, você pode adicionar as funções de wrapper AddHeadPerson e GetHeadPerson, como 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 tipo seguro para adicionar e recuperar CPerson objetos da lista derivado.Você pode ver que o GetHeadPerson função, é simplesmente encapsulando a conversão de tipo.

    Você também pode adicionar nova funcionalidade definindo novas funções que estendem os recursos da coleção em vez de apenas disposto a funcionalidade existente em invólucros de tipo seguro.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 foi adicionada à classe derivada como uma função de membro.

Consulte também

Conceitos

Coleções