Acessar todos os membros de uma coleção
As classes de coleção MFC array — ambos baseado em modelo e não — usam índices para acesso seus elementos.As classes de coleção de lista e MAP MFC — ambos baseado em modelo e não — usar um indicador do tipo POSIÇÃO para descrever uma determinada posição dentro da coleção.Para acessar um ou mais membros dessas coleções, você primeiro inicializar o indicador de posição e, em seguida, várias vezes passa essa posição para a coleção e pedir para retornar o próximo elemento.A coleção não é responsável por manter as 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 o MFC:
Uma matriz de iteração
Uma lista de iteração
Iterando um MAP
Para iterar um array
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 CObArrayuma das classes nontemplate predefinido. GetAt Retorna um ponteiro para um CPerson objeto. Para classes de coleção de tipos ponteiro — arrays ou listas — o primeiro parâmetro especifica a classe base; o segundo parâmetro especifica o tipo de armazenamento.
The CTypedPtrArray class also overloads the [ ] operator so that you can use the customary array-subscript syntax to access elements of an array.Uma alternativa para a demonstrativo no corpo do for loop acima é
CPerson* thePerson = myArray[i];
Este operador existe em ambas as Const and non-Const versões.The Const versão, que é invocado para Const arrays, podem aparecer somente na lado direito da demonstrativo de atribuição.
Para iterar uma lista
Use as funções de membro GetHeadPosition e GetNext para trabalhar sua maneira através da 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 de tipos ponteiro para contêm ponteiros para CPerson objetos. A declaração da lista semelhante da matriz no procedimento Para iterar um array , mas é derivado da classe CObList. GetNext Retorna um ponteiro para um CPerson objeto.
Para iterar um MAP
Use GetStartPosition para ir para o início do MAP e GetNextAssoc para várias vezes obter a próxima chave e valor do MAP, 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 MAP simples (em vez de uma coleção de tipos ponteiro) que usa a CString chaves e armazenamentos de ponteiros para CPerson objetos. Ao usar funções de acesso, sistema autônomo GetNextAssoc, a classe fornece ponteiros para CPerson objetos. Se você usar uma das coleções nontemplate MAP em vez disso, você deve converter o retornado CObject ponteiro para um ponteiro para um CPerson.
Observação: Para nontemplate mapas, o compilador requer uma referência a um CObject ponteiro no último parâmetro para GetNextAssoc. Na entrada, você deve converter sistema autônomo ponteiros para esse tipo, conforme mostrado no exemplo seguinte.
A solução de modelo é mais simples e ajuda a fornecer melhor segurança de tipos.O código nontemplate é mais complicado, sistema autônomo 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.