Classes com base em modelo
Este artigo explica as fortemente tipado baseado em modelo coleções de classes no MFC versão 3.0 e posterior.Usando esses modelos para criar conjuntos de fortemente tipado é mais conveniente e ajuda a fornecer mais eficiente do que usando as classes de coleção não baseadas em modelos de segurança de tipos.
MFC predefine duas categorias de conjuntos baseados em modelo:
Matriz simples, lista e MAP de classes
CArray, CList, CMap
Matrizes, listas e mapas de ponteiros digitados
CTypedPtrArray, CTypedPtrList, CTypedPtrMap
Todas as classes de coleção simples são derivadas de classe CObject, para que eles herdam a serialização, criação dinâmica e outras propriedades de CObject. Classes de coleção de tipos ponteiro exigem que você especifique a classe você deriva de — que deve ser uma das coleções de ponteiro nontemplate predefinidas pelo MFC, por exemplo, CPtrList ou CPtrArray. Sua nova classe de coleção herda da classe base especificada e funções de membro da classe nova usarem encapsuladas chamadas para os membros da classe base para reforçar a segurança de tipos.
Para obter mais informações sobre modelos C++, consulte Modelos in the Referência de linguagem C++.
Usando o Array Simple, lista e modelos de MAP
Para usar os modelos de coleção simples, você precisa saber quais parâmetros para usar em suas declarações de coleção e o tipo de dados que você pode armazenar nessas coleções.
Array simples e o uso da lista
Os array e a lista de classes simples, CArray and CList, aceitam dois parâmetros: TIPO and ARG_TYPE. Essas classes podem armazenar qualquer tipo de dados, que você especifica no TIPO parâmetro:
Tipos de dados C++ fundamentais, sistema autônomo, por exemplo, int, char, e float
C++ estruturas e classes
Outros tipos que você definir
Para maior conveniência e a eficiência, você pode usar o ARG_TYPE parâmetro para especificar o tipo de argumentos de função. Normalmente, especificar ARG_TYPE sistema autônomo uma referência ao tipo de chamada no TIPO parâmetro.Por exemplo:
CArray<int, int> myArray;
CList<CPerson, CPerson&> myList;
O primeiro exemplo declara uma coleção de matriz, myArray, que contém ints. O segundo exemplo declara uma coleção de lista, myList, que armazena CPerson objetos. Determinadas funções de membro das classes de coleção obtém argumentos cujo tipo é especificado pelo ARG_TYPE parâmetro do modelo. Por exemplo, a Adicionar função de membro de classe CArray leva uma ARG_TYPE argumento:
CArray<CPerson, CPerson&> personArr;
CPerson person;
personArr.Add(person);
Uso simples de MAP
A classe de MAP simples, CMap, aceita quatro parâmetros: CHAVE, ARG_KEY, VALOR, and ARG_VALUE. Assim como as classes array e lista as classes de MAP podem armazenar qualquer tipo de dados.Diferentemente das matrizes e listas, indexar e solicitar os dados que armazenam, mapas de associar chaves e valores: Você acesso um valor armazenado em um MAP, especificando o valor do associado a chave.The CHAVE parâmetro especifica o tipo de dados das chaves usadas para acessar dados armazenados no MAP.Se o tipo de CHAVE é uma estrutura ou classe, a ARG_KEY parâmetro normalmente é uma referência ao tipo especificado em CHAVE.The VALOR parâmetro especifica o tipo de itens armazenados no MAP.Se o tipo de ARG_VALUE é uma estrutura ou classe, o ARG_VALUE parâmetro normalmente é uma referência ao tipo especificado em VALOR.Por exemplo:
CMap< int, int, MY_STRUCT, MY_STRUCT& > myMap1;
CMap< CString, LPCTSTR, CPerson, CPerson& > myMap2;
O primeiro exemplo armazena MY_STRUCT valores, acesse-os por int chaves e retorna acessada MY_STRUCT itens por referência. O segundo exemplo armazena CPerson valores, acesse-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ê está procurando pessoas por sobrenome.
Porque o CHAVE parâmetro é do tipo CString e o KEY_TYPE parâmetro é do tipo LPCSTR, sistema autônomo chaves são armazenadas sistema autônomo itens do tipo no MAP CString mas mencionados sistema autônomo funções SetAt através de ponteiros de 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 de tipos ponteiro
Para usar os modelos de coleção de ponteiro digitado, você precisa saber quais parâmetros para usar em suas declarações de coleção e quais os tipos de dados que você pode armazenar essas coleções.
Ponteiro digitado array e uso da lista
Os ponteiro digitado matriz e lista de classes, CTypedPtrArray and CTypedPtrList, aceitam dois parâmetros: BASE_CLASS e TIPO.Essas classes podem armazenar qualquer tipo de dados, que você especifica no TIPO parâmetro.Eles são derivados de uma das classes de coleção nontemplate que armazena ponteiros; você especificar dessa classe base no BASE_CLASS. Arrays, use um dos CObArray ou CPtrArray. Para listas, use um dos CObList ou CPtrList.
Na verdade, quando você declara uma coleção com base em, digamos que CObList, a nova classe herda não apenas os membros de sua classe base, mas também declara um número de membro de segurança de tipos adicional de funções e operadores que ajudam a fornecer segurança de tipos, encapsulando chamadas para os membros da classe base. Esses encapsulamentos gerenciam todos os conversão de tipo necessário.Por exemplo:
CTypedPtrArray<CObArray, CPerson*> myArray;
CTypedPtrList<CPtrList, MY_STRUCT*> myList;
O primeiro exemplo declara uma matriz de ponteiro digitado, myArray, derivado de CObArray. A matriz armazena e retorna os ponteiros para CPerson objetos (onde CPerson é uma classe derivada de CObject). You can call any CObArray member function, or you can call the new type-safe GetAt and ElementAt functions or use the type-safe [ ] operator.
O segundo exemplo declara uma lista de ponteiro digitado, myList, derivado de CPtrList. A lista armazena e retorna os ponteiros para MY_STRUCT objetos. Uma classe com base em CPtrList usado para armazenar ponteiros para objetos não derivados de CObject. CTypedPtrList tem um número de funções de membro de fortemente tipado: GetHead, GetTail, RemoveHead, RemoveTail, GetNext, GetPrev, e GetAt.
Uso do ponteiro digitado MAP
A classe de MAP de ponteiro digitado, CTypedPtrMap, usa três parâmetros: BASE_CLASS, CHAVE, and VALOR.The BASE_CLASS parâmetro especifica a classe da qual derivam da nova classe: CMapPtrToWord, CMapPtrToPtr, CMapStringToPtr, CMapWordToPtr, CMapStringToOb, e assim por diante. CHAVE é semelhante a CHAVE in CMap: Ele especifica o tipo de chave usado para pesquisas.VALOR é semelhante a VALOR in CMap: Ele especifica o tipo de objeto armazenado no MAP.Por exemplo:
CTypedPtrMap<CMapPtrToPtr, CString, MY_STRUCT*> myPtrMap;
CTypedPtrMap<CMapStringToOb, CString, CPerson*> myPersonMap;
O primeiro exemplo é um MAP baseado em CMapPtrToPtr — it uses CString teclas mapeadas para ponteiros para MY_STRUCT. Você pode pesquisar um ponteiro armazenado chamando um fortemente tipado Lookup função de membro. You can use the [ ] operator to look up a stored pointer and add it if not found.E você pode iterar o MAP usando a segurança de tipos GetNextAssoc função. Você também pode telefonar outras funções de membro de classe CMapPtrToPtr.
O segundo exemplo é um MAP com base em CMapStringToOb — ele usa chaves de string mapeados para indicadores armazenados para CMyObject objetos. Você pode usar os mesmos membros de fortemente tipado descritos no parágrafo anterior, ou você pode chamar membros da classe CMapStringToOb.
Observação: |
---|
Se você especificar um classe or struct tipo para o VALOR parâmetro, em vez de um ponteiro ou uma referência para o tipo, a classe ou estrutura deve ter um construtor de cópia. |
Para obter mais informações, consulte Como criar uma coleção de fortemente tipado.