Partilhar via


Template-Based Aulas

Este artigo explica as classes de coleção baseadas em modelo seguro de tipo no MFC versão 3.0 e posterior. Usar esses modelos para criar coleções seguras para tipos é mais conveniente e ajuda a fornecer segurança de tipo de forma mais eficaz do que usar as classes de coleção não baseadas em modelos.

MFC predefine duas categorias de coleções baseadas em modelo:

As classes de coleção simples são todas derivadas da classe CObject, portanto, elas herdam a serialização, a criação dinâmica e outras propriedades do CObject. As classes de coleção de ponteiros digitados exigem que você especifique a classe da qual você deriva — que deve ser uma das coleções de ponteiros não modelo predefinidas pelo MFC, como CPtrList ou CPtrArray. Sua nova classe de coleção herda da classe base especificada, e os métodos da nova classe usam chamadas encapsuladas para os membros da classe base para impor a segurança de tipo.

Para obter mais informações sobre modelos C++, consulte Modelos na referência da linguagem C++.

Usando modelos simples de matriz, lista e mapa

Para usar os modelos de coleção simples, você precisa saber que tipo de dados você pode armazenar nessas coleções e quais parâmetros usar em suas declarações de coleção.

Uso simples de matrizes e listas

As classes simples de matriz e lista, CArray e CList, usam dois parâmetros: TYPE e ARG_TYPE. Essas classes podem armazenar qualquer tipo de dados, que você especifica no parâmetro TYPE :

  • Tipos de dados C++ fundamentais, como int, chare float

  • Estruturas e classes C++

  • Outros tipos que você define

Para conveniência e eficiência, você pode usar o parâmetro ARG_TYPE para especificar o tipo de argumentos de função. Normalmente, você especifica ARG_TYPE como uma referência ao tipo nomeado no parâmetro TYPE . Por exemplo:

CArray<int, int> myArray;
CList<CPerson, CPerson &> myList;

O primeiro exemplo declara uma coleção de matrizes, myArray, que contém **int**s. O segundo exemplo declara uma coleção de lista, myList, que armazena CPerson objetos. Certas funções de membro das classes de coleção usam argumentos cujo tipo é especificado pelo parâmetro ARG_TYPE template. Por exemplo, a Add função de membro da classe CArray usa um ARG_TYPE argumento:

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

Utilização Simples de Mapas

A classe de mapa simples, CMap, usa quatro parâmetros: KEY, ARG_KEY, VALUE e ARG_VALUE. Como as classes de matriz e lista, as classes de mapa podem armazenar qualquer tipo de dados. Ao contrário das matrizes e listas, que indexam e ordenam os dados armazenados, os mapas associam chaves e valores: você acessa um valor armazenado em um mapa especificando a chave associada do valor. O parâmetro KEY especifica o tipo de dados das chaves usadas para acessar os dados armazenados no mapa. Se o tipo de KEY for uma estrutura ou classe, o parâmetro ARG_KEY é normalmente uma referência ao tipo especificado em KEY. O parâmetro VALUE especifica o tipo de itens armazenados no mapa. Se o tipo de ARG_VALUE for uma estrutura ou classe, o parâmetro ARG_VALUE é normalmente uma referência ao tipo especificado em VALUE. Por exemplo:

CMap<int, int, MY_STRUCT, MY_STRUCT &> myMap1;
CMap<CString, LPCTSTR, CPerson, CPerson &> myMap2;

O primeiro exemplo armazena MY_STRUCT valores, acessa-os por int chaves e retorna itens acessados MY_STRUCT por referência. O segundo exemplo armazena CPerson valores, acessa-os por CString chaves e retorna referências a itens acessados. Este exemplo pode representar um catálogo de endereços simples, no qual você procura pessoas pelo sobrenome.

Como o parâmetro KEY é do tipo CString e o parâmetro KEY_TYPE é do tipo LPCSTR, as chaves são armazenadas no mapa como itens do tipo CString , mas são referenciadas em funções como SetAt através de ponteiros do tipo LPCSTR. Por exemplo:

CMap<CString, LPCTSTR, CPerson, CPerson &> myMap;
CPerson person;
LPCTSTR lpstrName = _T("Jones");
myMap.SetAt(lpstrName, person);

Usando modelos de coleção Typed-Pointer

Para usar os modelos de coleção de ponteiro digitado, você precisa saber quais tipos de dados podem ser armazenados nessas coleções e quais parâmetros usar em suas declarações de coleção.

Typed-Pointer uso de matrizes e listas

A matriz de ponteiro digitado e as classes de lista, CTypedPtrArray e CTypedPtrList, usam dois parâmetros: BASE_CLASS e TYPE. Essas classes podem armazenar qualquer tipo de dados, que você especifica no parâmetro TYPE . Eles são derivados de uma das classes de coleção não modelo que armazena ponteiros; Você especifica essa classe base em BASE_CLASS. Para matrizes, use CObArray ou CPtrArray. Para listas, use CObList ou CPtrList.

Na verdade, quando se declara uma coleção com base em, por exemplo CObList, a nova classe não apenas herda os membros de sua classe base, mas também declara uma série de funções adicionais de membros com segurança de tipo e operadores que ajudam a garantir segurança de tipo ao encapsular chamadas para os membros da classe base. Esses encapsulamentos gerenciam todas as conversões de tipo necessárias. Por exemplo:

CTypedPtrArray<CObArray, CPerson *> myArray;
CTypedPtrList<CPtrList, MY_STRUCT *> myList;

O primeiro exemplo declara uma matriz de ponteiro digitada, myArray, derivada de CObArray. A matriz armazena e retorna ponteiros para CPerson objetos (onde CPerson é uma classe derivada de CObject). Você pode chamar qualquer função de membro CObArray, ou pode chamar as novas funções seguras de tipo GetAt e ElementAt, ou usar o operador seguro de tipo [ ].

O segundo exemplo declara uma lista de ponteiros digitados, myList, derivada de CPtrList. A lista armazena e retorna ponteiros para MY_STRUCT objetos. Uma classe baseada em CPtrList é usada para armazenar ponteiros para objetos não derivados de CObject. CTypedPtrList tem uma série de funções de membro seguro para tipo: GetHead, GetTail, RemoveHead, RemoveTail, GetNext, GetPreve GetAt.

Typed-Pointer Utilização do Mapa

A classe de mapa de ponteiro digitado, CTypedPtrMap, usa três parâmetros: BASE_CLASS, KEY e VALUE. O parâmetro BASE_CLASS especifica a classe da qual derivar a nova classe: CMapPtrToWord, CMapPtrToPtr, CMapStringToPtr, CMapWordToPtr, , CMapStringToObe assim por diante. KEY é análogo a KEY em CMap: Especifica o tipo da chave usada para pesquisas. VALUE é análogo a VALUE em CMap: Especifica o tipo de objeto armazenado no mapa. Por exemplo:

CTypedPtrMap<CMapPtrToPtr, CString, MY_STRUCT*> myPtrMap;
CTypedPtrMap<CMapStringToOb, CString, CPerson*> myPersonMap;

O primeiro exemplo é um mapa baseado em CMapPtrToPtr — ele usa CString teclas mapeadas para ponteiros para MY_STRUCT. Você pode procurar um ponteiro armazenado chamando uma função membro de tipagem segura Lookup. Você pode usar o operador [ ] para procurar um ponteiro armazenado e adicioná-lo se não for encontrado. E você pode iterar o mapa usando a função type-safe GetNextAssoc . Você também pode chamar outras funções de membro da classe CMapPtrToPtr.

O segundo exemplo é um mapa baseado em CMapStringToOb — ele usa chaves de strings mapeadas para ponteiros armazenados de objetos CMyObject. Você pode usar os mesmos membros seguros de tipo descritos no parágrafo anterior ou pode chamar membros da classe CMapStringToOb.

Observação

Se especificar um tipo class ou struct para o parâmetro VALUE, em vez de um ponteiro ou referência ao tipo, a classe ou estrutura deve ter um construtor de cópia.

Para obter mais informações, consulte Como criar uma coleção de Type-Safe.

Ver também

Coleções