Accedere a tutti i membri di una raccolta
Le classi di raccolte di matrice MFC — sia basato su modelli che non utilizzano indici di utilizzo per accedere ai relativi elementi.Le classi di raccolte elenco e del mapping di MFC — sia basato su modelli che non utilizzano utilizzano un indicatore di tipo POSIZIONE per descrivere una posizione specificata all'interno della raccolta.Per accedere a uno o più membri di queste raccolte, è innanzitutto necessario inizializzare il localizzatore e quindi ripetutamente passate che il percorso alla raccolta e gli seguente per restituire l'elemento seguente.La raccolta non è responsabile della gestione delle informazioni sullo stato sullo stato di avanzamento dell'iterazione.Tali informazioni vengono mantenute nell'indicatore di posizione.Tuttavia, in base a una determinata posizione, la raccolta è responsabile della restituzione l'elemento successivo.
Le procedure riportate di seguito viene illustrato come scorrere i tre tipi principali di raccolte disponibili in MFC:
Ripetizione della matrice
Ripetizione di elenco
Ripetizione di mapping
Per ripetere una matrice
Numeri di indice sequenziali di utilizzo con la funzione membro di GetAt :
CTypedPtrArray<CObArray, CPerson*> myArray; myArray.Add(new CPerson()); for (int i = 0; i < myArray.GetSize();i++) { CPerson* thePerson = myArray.GetAt(i); thePerson->AssertValid(); }
In questo esempio viene utilizzata una matrice di puntatore tipizzato che contiene i puntatori a oggetti di CPerson .La matrice è derivata dalla classe CObArray, una delle classi predefinite non modello.GetAt restituisce un puntatore a un oggetto di CPerson .Per le classi di raccolte tipizzate del puntatore — matrici o elenchi — il primo parametro specifica la classe base; il secondo parametro specifica il tipo per archiviare.
La classe di CTypedPtrArray anche esegue l'overload dell'operatore di [] in modo da poter utilizzare la sintassi solito di matrice-pedice per accedere agli elementi di una matrice.Un'alternativa all'istruzione nel corpo del ciclo di for precedente viene
CPerson* thePerson = myArray[i];
Questo operatore esiste in entrambi i const e versioni non diconst .La versione di const , che viene richiamata per le matrici di const , può apparire solo nella parte destra di un'istruzione di assegnazione.
Per scorrere un elenco
Utilizzare le funzioni membro GetHeadPosition e GetNext per utilizzare la modalità a l:
CTypedPtrList<CObList, CPerson*> myList; myList.AddHead(new CPerson()); POSITION pos = myList.GetHeadPosition(); while(pos != NULL) { CPerson* thePerson = myList.GetNext(pos); thePerson->AssertValid(); }
In questo esempio viene utilizzato un elenco tipizzato del puntatore per contenere i puntatori a oggetti di CPerson .La dichiarazione dell'elenco è simile a quello della matrice nella procedura Per ripetere una matrice ma è derivata dalla classe CObList.GetNext restituisce un puntatore a un oggetto di CPerson .
Per ripetere una mappa
Utilizzo GetStartPosition ottenere la parte superiore di mapping e di GetNextAssoc per ottenere ripetutamente la chiave e il valore seguenti dalla mappa, come illustrato nel seguente esempio:
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 }
In questo esempio viene utilizzato un modello semplice di mapping anziché di una raccolta tipizzata del puntatore) che utilizza che CString impostati e archivia i puntatori a oggetti di CPerson .Quando si utilizzano funzioni di accesso come GetNextAssoc, la classe fornisce i puntatori a oggetti di CPerson .Se si utilizza una delle raccolte di mapping non template invece, è necessario eseguire il cast del puntatore restituito di CObject a un puntatore a CPerson.
[!NOTA]
Per i mapping non template, il compilatore richiede un riferimento a un puntatore di CObject nell'ultimo parametro a GetNextAssoc.In input, è necessario eseguire il cast dei puntatori a tale tipo, come mostrato nell'esempio seguente.
La soluzione del modello è più semplice e le guide forniscono una maggiore indipendenza dai tipi.Il codice non template è più complesso, ad esempio è possibile vedere di seguito:
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 }
Per ulteriori informazioni, vedere Eliminare tutti gli oggetti in una raccolta di CObject.