Acessar todos os membros de uma coleção
As classes de coleção do MFC array — ambos baseado no modelo e não — usam índices para acessar seus elementos.Classes de coleção MFC lista e mapa — ambos baseado no modelo e não — usar um indicador do tipo posição para descrever uma determinada posição dentro da coleção.Para acessar membros de uma ou mais dessas coleções, você primeiro inicializar o indicador de posição repetidamente passa a posição para a coleção e pede a ele para retornar o próximo elemento.A coleção não é responsável por manter informações de estado sobre o progresso da iteração.Que informações são mantidas no indicador de posição.Mas, dada uma determinada posição, a coleção é responsável por retornar o próximo elemento.
Os procedimentos a seguir mostram como iterar sobre os três principais tipos de coleções fornecidos com MFC:
Iterando uma matriz
Iterando uma lista
Iterando um mapa
Para fazer a iteração de uma matriz
Use números seqüenciais de índice com o GetAt função de membro:
CTypedPtrArray<CObArray, CPerson*> myArray; myArray.Add(new CPerson()); for (int i = 0; i < myArray.GetSize();i++) { CPerson* thePerson = myArray.GetAt(i); thePerson->AssertValid(); }
Este exemplo usa uma matriz de ponteiro digitado contém ponteiros para CPerson objetos.A matriz é derivada da classe CObArray, um de nontemplate classes predefinidas.GetAtRetorna um ponteiro para um CPerson objeto.Classes de coleção de ponteiro digitado — arrays ou listas — o primeiro parâmetro especifica a classe base; o segundo parâmetro especifica o tipo de armazenamento.
O CTypedPtrArray classe também sobrecargas de operador para que você possa usar a sintaxe habitual do subscrito da matriz para acessar os elementos de uma matriz.Uma alternativa à instrução no corpo do for loop acima é
CPerson* thePerson = myArray[i];
Este operador existe em ambas as const e não-const versões.O const versão, que é invocado para const matrizes, pode aparecer somente no lado direito de uma instrução de atribuição.
Para iterar uma lista
Use as funções de membro GetHeadPosition e GetNext para examinar a lista:
CTypedPtrList<CObList, CPerson*> myList; myList.AddHead(new CPerson()); POSITION pos = myList.GetHeadPosition(); while(pos != NULL) { CPerson* thePerson = myList.GetNext(pos); thePerson->AssertValid(); }
Este exemplo usa uma lista ponteiro digitado contém ponteiros para CPerson objetos.A declaração de lista semelhante da matriz no procedimento iterar uma matriz , mas é derivada da classe CObList.GetNextRetorna um ponteiro para um CPerson objeto.
Para iterar um mapa
Use GetStartPosition para ir para o início do mapa e GetNextAssoc repetidamente obter a próxima chave e valor do mapa, conforme mostrado pelo seguinte exemplo:
CMap<CString, LPCTSTR, CPerson*, CPerson*> myMap; CPerson myPerson; myMap.SetAt(_T("Bill"), &myPerson); POSITION pos = myMap.GetStartPosition(); while(pos != NULL) { CPerson* pPerson; CString string; // Get key (string) and value (pPerson) myMap.GetNextAssoc(pos, string, pPerson); // Use string and pPerson }
Este exemplo usa um modelo de mapa simples (em vez de uma coleção de ponteiro digitado) que usa CString chaves e armazena ponteiros para CPerson objetos.Ao usar funções de acesso, como GetNextAssoc, a classe fornece ponteiros para CPerson objetos.Se você usar uma das coleções de mapa nontemplate, você deve converter o retornado CObject ponteiro para um ponteiro para um CPerson.
Observação Para mapas de nontemplate, o compilador requer uma referência a um CObject ponteiro no último parâmetro para GetNextAssoc.Na entrada, você deve converter os ponteiros para esse tipo, conforme mostrado no exemplo a seguir.
O modelo mais simples e a solução ajuda a fornecer melhor segurança de tipos.O código de nontemplate é mais complicado, como você pode ver aqui:
CMapStringToOb myMap; // A nontemplate collection class CPerson myPerson; myMap.SetAt(_T("Bill"), &myPerson); POSITION pos = myMap.GetStartPosition(); while(pos != NULL) { CPerson* pPerson; CString string; // Gets key (string) and value (pPerson) myMap.GetNextAssoc(pos, string, (CObject*&)pPerson); ASSERT(pPerson->IsKindOf( RUNTIME_CLASS(CPerson))); // Use string and pPerson }
Para obter mais informações, consulte Excluir todos os objetos em uma coleção CObject.