Classes com base no modelo
Este artigo explica as classes com base em tipo seguras na coleção de MFC versão 3,0 e posterior. Usar esses modelos para criar coleções seguras tipo é mais conveniente e ajuda fornecem segurança de tipo mais eficiente do que usar as classes de coleção não baseadas em modelos.
O MFC predefine duas categorias de coleções com base em:
Matriz, lista, e classes simples do mapa
CArray, CList, CMap
Matrizes, listas, mapas e de ponteiros digitados
CTypedPtrArray, CTypedPtrList, CTypedPtrMap
Todas as classes de coleção simples são derivadas da classe CObject, assim que herdam a serialização, a criação dinâmico, e outras propriedades de CObject. As classes de coleção do tipo de ponteiro requer que você especifique a classe que deriva de você se — que deve ser uma das coleções do ponteiro de nontemplate predefinidas por MFC, como CPtrList ou CPtrArray. Sua nova classe de coleção herda da classe base especificada, e das chamadas encapsulados nova da classe uso das funções de membro para membros da classe base para impor a segurança de tipo.
Para obter mais informações sobre modelos C++, consulte Modelosna referência de linguagem C++.
Usando a matriz, lista, e modelos simples do mapa
Para usar os modelos simples a coleção, você precisa saber que tipo de dados você pode armazenar nessas coleções e quais parâmetros a serem usados em suas declarações da coleção.
Uso simples de matriz e de lista
As classes simples de matriz e de lista, CArray e CList, usam dois parâmetros: TYPE e ARG_TYPE. Essas classes podem armazenar qualquer tipo de dados, que você especificar no parâmetro de tipo :
Tipos de dados fundamentais 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 de ARG_TYPE para especificar o tipo de argumentos de função. Normalmente, você especifica ARG_TYPE como uma referência ao tipo que é chamado no parâmetro de tipo . Por exemplo:
CArray<int, int> myArray;
CList<CPerson, CPerson&> myList;
O primeiro exemplo a seguir declara uma coleção de matriz, myArray, que contém intS. O segundo exemplo a seguir declara uma coleção de listas, myList, que armazena objetos de CPerson . Determinadas funções de membro das classes de coleção têm os argumentos cujo tipo é especificado pelo parâmetro do modelo de ARG_TYPE . Por exemplo, a função de membro de Adicionar da classe CArray usa um argumento de ARG_TYPE :
CArray<CPerson, CPerson&> personArr;
CPerson person;
personArr.Add(person);
Uso simples de mapa
A classe simples do mapa, CMap, tem quatro parâmetros: KEY, ARG_KEY, VALUE, e ARG_VALUE. Como as classes de matriz e de lista, as classes de mapa podem armazenar qualquer tipo de dados. Ao contrário das matrizes e listas, o índice que pedidos e os dados que armazena, o associado de mapas fecha e avalia: Você acessa um valor armazenado em um mapa especificando a chave associada do valor. O parâmetro KEY especifica o tipo de dados de chaves usadas para acessar os dados armazenados no mapa. Se o tipo de RESTRIÇÃO é uma estrutura ou uma classe, o parâmetro de ARG_KEY é normalmente uma referência ao tipo especificado em KEY. O parâmetro VALUE especifica o tipo de itens armazenados no mapa. Se o tipo de ARG_VALUE é uma estrutura ou uma classe, o parâmetro de ARG_VALUE é normalmente 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 de MY_STRUCT , acessá-los por chaves de int , e o retorna itens acessados de MY_STRUCT por referência. O segundo exemplo armazena valores de CPerson , acessa por chaves de CString , e retorna referências de itens acessados. Este exemplo pode representar uma lista de endereços simples, na qual você pesquisa pessoas sobrenome.
Como o parâmetro KEY é do tipo CString e o parâmetro de KEY_TYPE é do tipo LPCSTR, as chaves são armazenadas no mapa como itens do tipo CString mas referenciadas em funções como SetAt por ponteiros do tipo LPCSTR. Por exemplo:
CMap< CString, LPCTSTR, CPerson, CPerson& > myMap;
CPerson person;
LPCTSTR lpstrName = _T("Jones");
myMap.SetAt(lpstrName, person);
Usando modelos da coleção de Digitar- ponteiro
Para usar os modelos da coleção de digitar- ponteiro, você precisa saber quais tipos de dados você pode armazenar nessas coleções e quais parâmetros a serem usados em suas declarações da coleção.
Matriz de Digitar- ponteiro e uso de lista
As classes de matriz e lista de digitar- ponteiro, CTypedPtrArray e CTypedPtrList, usam dois parâmetros: BASE_CLASS e TYPE. Essas classes podem armazenar qualquer tipo de dados, que você especificar no parâmetro de tipo . São derivados de uma das classes de coleção de nontemplate que armazena ponteiros; você especifica essa classe base em BASE_CLASS. Para matrizes, use CObArray ou CPtrArray. Para listas, use CObList ou CPtrList.
De fato, quando declara uma coleção baseada, digamos CObList, a nova classe herda não apenas membros da classe base, mas também declara um número funções de membro e operadores tipo seguro adicionais que fornece ajuda a segurança de tipo encapsulando chamadas para os membros da classe base. Essas encapsulamento gerenciar qualquer conversão de tipos necessária. Por exemplo:
CTypedPtrArray<CObArray, CPerson*> myArray;
CTypedPtrList<CPtrList, MY_STRUCT*> myList;
O primeiro exemplo a seguir declara uma matriz de digitar- ponteiro, myArray, derivado de CObArray. A matriz armazena e retorna ponteiros para os objetos de CPerson (onde CPerson é uma classe derivada de CObject). Você pode chamar qualquer função de membro de CObArray , ou você pode chamar as novas GetAt e funções de tipo seguro ElementAt ou usar o operador fortemente tipado de [] .
O segundo exemplo a seguir declara uma lista de digitar- ponteiro, myList, derivado de CPtrList. A lista e retorna armazena ponteiros para os objetos de MY_STRUCT . Uma classe com base em CPtrList é usada para armazenar ponteiros para os objetos não derivados de CObject. CTypedPtrList tem várias funções de membro do tipo seguras: GetHead, GetTail, RemoveHead, RemoveTail, GetNext, GetPrev, e GetAt.
Uso do mapa de Digitar- ponteiro
A classe do mapa de digitar- ponteiro, CTypedPtrMap, tem três parâmetros: BASE_CLASS, KEY, e VALUE. O parâmetro de BASE_CLASS especifica a classe da qual derivar a nova classe: CMapPtrToWord, CMapPtrToPtr, CMapStringToPtr, CMapWordToPtr, CMapStringToOb, e assim por diante. A RESTRIÇÃO é análoga CLOSE em CMap: Especifica o tipo de chave usada para pesquisas. VALUE é análoga AVALIAR 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 — usa as chaves de CString mapeadas para os ponteiros a MY_STRUCT. Você pode pesquisar um ponteiro armazenado chama uma função de membro fortemente tipado de Lookup . Você pode usar o operador de [] para pesquisar um ponteiro armazenado e adicioná-lo caso não seja localizado). E você pode iterar o mapa usando a função fortemente tipado de GetNextAssoc . Você também pode chamar outras funções de membro da classe CMapPtrToPtr.
O segundo exemplo é um mapa baseado em CMapStringToOb — usa as chaves de cadeia de caracteres mapeadas para os ponteiros armazenados nos objetos de CMyObject . Você pode usar os mesmos membros tipo seguro descritos no parágrafo anterior, ou você pode chamar membros da classe CMapStringToOb.
Dica
Se você especificar um tipo de class ou de struct para o parâmetro VALUE , em vez de um ponteiro ou uma referência ao tipo, a classe ou a estrutura devem ter um construtor de cópia.
Para obter mais informações, consulte Como fazer uma coleção fortemente tipado.