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:
Classes simples de matriz, lista e mapa
CArray
,CList
,CMap
Matrizes, listas e mapas de ponteiros tipados
CTypedPtrArray
,CTypedPtrList
,CTypedPtrMap
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
efloat
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.