Compartilhar via


Classes com base no modelo

Observação

A biblioteca Microsoft Foundation Classes (MFC) continua sendo suportada. No entanto, não estamos mais adicionando recursos ou atualizando a documentação.

Este artigo explica as classes de coleção baseadas em modelo fortemente tipadas no MFC versão 3.0 e posteriores. 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 tipadas exigem que você especifique a classe da qual você deriva, que deve ser uma das coleções de ponteiros sem modelo 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 de tipos.

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);

Como usar 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 Uso de Matrizes e Listas

As classes de matriz e lista de ponteiro tipado, CTypedPtrArray e CTypedPtrList, utilizam 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 baseadas em template que armazenam ponteiros; você especifica essa classe base em BASE_CLASS. Para matrizes, use ou CObArray ou CPtrArray. Para listas, use ou CObList ou CPtrList.

Na verdade, quando você declara uma coleção baseada em, digamos CObList, a nova classe não só herda os membros de sua classe base, como também declara uma série de funções e operadores membros fortemente tipados adicionais que ajudam a fornecer segurança de tipos 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 ponteiros tipados, 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 membro CObArray, ou 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 tipado, 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 várias funções de membro de tipo seguro: GetHead, GetTail, RemoveHead, RemoveTail, GetNext, GetPrev, e GetAt.

Uso do mapa 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 chaves CString mapeadas para ponteiros para MY_STRUCT. Você pode pesquisar um ponteiro armazenado chamando uma função de membro Lookup fortemente tipada. Você pode usar o operador [ ] para pesquisar um ponteiro armazenado e adicioná-lo se não for encontrado. Você pode iterar o mapa usando a função GetNextAssoc fortemente tipada. 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 cadeia de caracteres mapeadas para ponteiros armazenados para objetos CMyObject. Você pode usar os mesmos membros fortemente tipados 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