Compartilhar via


Classes Template-Based

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

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

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

Para obter mais informações sobre modelos C++, consulte Modelos na Referência de 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 matriz e lista

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

  • Tipos de dados básicos do C++, como int, chare float

  • Estruturas e classes do 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, myArrayque contém **int**s. O segundo exemplo declara uma coleção de listas, myListque armazena CPerson objetos. Determinadas funções de membro das classes de coleção assumem argumentos cujo tipo é especificado pelo parâmetro de modelo ARG_TYPE . Por exemplo, a Add função membro da classe CArray usa um argumento ARG_TYPE :

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

Uso simples do mapa

A classe de mapa simples, CMap, usa quatro parâmetros: KEY, ARG_KEY, VALUE e ARG_VALUE. Assim como as classes de matriz e lista, as classes de mapa podem armazenar qualquer tipo de dados. Ao contrário de 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 será uma referência ao tipo especificado em KEY. O parâmetro VALUE especifica o tipo dos itens armazenados no mapa. Se o tipo de ARG_VALUE for uma estrutura ou classe, o parâmetro ARG_VALUE normalmente será 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 por 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 de tipo CString , mas são referenciadas em funções como SetAt por meio 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 tipado, você precisa saber quais tipos de dados você pode armazenar nessas coleções e quais parâmetros usar em suas declarações de coleção.

Typed-Pointer Matriz e Uso da Lista

A matriz de ponteiro tipado e as classes de lista, CTypedPtrArray e CTypedPtrList, assumem dois parâmetros: BASE_CLASS e TYPE. Essas classes podem armazenar qualquer tipo de dados, que você especificar no parâmetro TYPE . Elas são derivadas de uma das classes de coleção não destemperadas que armazena ponteiros; especifique essa classe base em BASE_CLASS. Para matrizes, use ou CObArrayCPtrArray. Para listas, use ou CObListCPtrList.

Na verdade, quando você declara uma coleção com base em, digamos CObList, a nova classe não só herda os membros de sua classe base, mas também declara uma série de funções de membro e operadores adicionais de tipo seguro que ajudam a fornecer segurança de tipo encapsulando chamadas para os membros da classe base. Esses encapsulamentos gerenciam toda a conversão de tipo necessária. Por exemplo:

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

O primeiro exemplo declara uma matriz de ponteiro tipado, myArrayderivada de CObArray. A matriz armazena e retorna ponteiros para CPerson objetos (de onde CPerson está uma classe derivada CObject). Você pode chamar qualquer CObArray função membro ou chamar o novo tipo de segurança GetAt e ElementAt funções ou usar o operador type-safe [ ] .

O segundo exemplo declara uma lista de ponteiros tipado, myListderivada 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. CTypedPtrListtem várias funções de membro de tipo seguro: GetHead, , GetTail, RemoveHead, RemoveTail, , GetNext, e GetAtGetPrev.

Uso do mapa de Typed-Pointer

A classe de mapa de ponteiro tipado, 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, CMapWordToPtre CMapStringToObassim 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 chaves mapeadas para ponteiros para MY_STRUCT. Você pode pesquisar um ponteiro armazenado chamando uma função de membro com segurança Lookup de tipo. Você pode usar o operador [ ] para pesquisar 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 membro da classe CMapPtrToPtr.

O segundo exemplo é um mapa baseado em CMapStringToOb : ele usa chaves de cadeia de caracteres mapeadas para ponteiros armazenados para CMyObject objetos. Você pode usar os mesmos membros type-safe descritos no parágrafo anterior ou pode chamar membros da classe CMapStringToOb.

Observação

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

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

Consulte também

Coleções