Condividi tramite


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.

Vedere anche

Concetti

Raccolte