Compartilhar via


Classes com base no modelo

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 fortemente tipadas é mais conveniente e ajuda a fornecer segurança de tipos 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 mais informações sobre modelos C++, confira Modelos na Referência de Linguagem C++.

Como usar modelos de matriz, lista e mapa simples

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 de matriz e lista simples

As classes de matriz e lista simples, CArray e CList, utilizam 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 básicos do C++, como int, char e 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 listas, myList, que armazena objetos CPerson. Determinadas funções de membro das classes de coleção têm argumentos cujo tipo é especificado pelo parâmetro de modelo ARG_TYPE. Por exemplo, a função de membro Add da classe CArray usa um argumento ARG_TYPE:

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

Uso de mapa simples

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 de matrizes e listas, que indexam e encomendam os dados que armazenam, 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 valores MY_STRUCT, acessa-os por chaves int e retorna itens MY_STRUCT acessados por referência. O segundo exemplo armazena valores CPerson, acessa-os por chaves CString 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.

Uso de matriz e lista de ponteiro tipado

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 sem modelo que armazenam ponteiros; você especifica essa classe base em BASE_CLASS. Para matrizes, use CObArray ou CPtrArray. Para listas, use 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 ponteiro tipado, myArray, derivada de CObArray. A matriz armazena e retorna ponteiros para objetos CPerson (em que CPerson é uma classe derivada de CObject). Você pode chamar qualquer função de membro CObArray ou chamar as novas funções fortemente tipadas GetAt e ElementAt ou usar o operador fortemente tipado [ ].

O segundo exemplo declara uma lista de ponteiros tipado, myList, derivada de CPtrList. A lista armazena e retorna ponteiros para objetos MY_STRUCT. Uma classe baseada em CPtrList é usada para armazenar ponteiros para objetos não derivados de CObject. CTypedPtrList tem várias funções de membro fortemente tipadas: GetHead, GetTail, RemoveHead, RemoveTail, GetNext, GetPrev e GetAt.

Uso do mapa ponteiro tipado

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, CMapWordToPtr, CMapStringToOb etc. 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 ele 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 tipo class ou struct 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 mais informações, confira Como criar uma coleção fortemente tipada.

Confira também

Coleções