Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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:
Classes simples de matriz, lista e mapa
CArray, ,CListCMapMatrizes, listas e mapas de ponteiros tipados
CTypedPtrArray, ,CTypedPtrListCTypedPtrMap
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,charefloatEstruturas 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.