Compartir a través de


Acceso a todos los miembros de una colección

Las clases de colección de matrices MFC (basadas en plantillas y no) usan índices para tener acceso a sus elementos. Las clases de colección de mapas y lista de MFC , tanto basadas en plantillas como no, usan un indicador de tipo POSITION para describir una posición determinada dentro de la colección. Para acceder a uno o varios miembros de estas colecciones, primero inicializa el indicador de posición y, a continuación, pasa repetidamente esa posición a la colección y pide que devuelva el siguiente elemento. La colección no es responsable de mantener información sobre el estado del progreso de la iteración. Esa información se mantiene en el indicador de posición. Pero, dada una posición determinada, la colección es responsable de devolver el siguiente elemento.

Los procedimientos siguientes muestran cómo iterar en los tres tipos principales de colecciones proporcionadas por MFC:

Para recorrer en iteración una matriz

  1. Use números de índice secuenciales con la función miembro GetAt :

    CTypedPtrArray<CObArray, CPerson *> myArray;
    
    myArray.Add(new CPerson());
    for (int i = 0; i < myArray.GetSize(); i++)
    {
       CPerson *thePerson = myArray.GetAt(i);
       thePerson->AssertValid();
    }
    

    Este ejemplo usa una matriz de puntero con tipo que contiene punteros a objetos CPerson . La matriz se deriva de la clase CObArray, una de las clases predefinidas nontemplate. GetAt devuelve un puntero a un CPerson objeto . En el caso de las clases de colección de punteros tipadas (matrices o listas), el primer parámetro especifica la clase base; el segundo parámetro especifica el tipo que se va a almacenar.

    La CTypedPtrArray clase también sobrecarga el operador [ ] para que pueda usar la sintaxis de subíndice de matriz habitual para tener acceso a los elementos de una matriz. Una alternativa a la instrucción del cuerpo del bucle for anterior es

    CPerson *thePerson = myArray[i];
    

    Este operador existe tanto en versiones const como en versiones sin const. La versión const, que se invoca para las matrices const, puede aparecer solo en el lado derecho de una instrucción de asignación.

Para recorrer en iteración una lista

  1. Utiliza las funciones miembro GetHeadPosition y GetNext para recorrer la lista.

    CTypedPtrList<CObList, CPerson *> myList;
    
    myList.AddHead(new CPerson());
    POSITION pos = myList.GetHeadPosition();
    while (pos != NULL)
    {
       CPerson *thePerson = myList.GetNext(pos);
       thePerson->AssertValid();
    }
    

    En este ejemplo se usa una lista de punteros tipada para contener punteros a objetos CPerson. La declaración de lista es similar a la de la matriz del procedimiento Para iterar una matriz , pero se deriva de la clase CObList. GetNext devuelve un puntero a un CPerson objeto .

Para recorrer en iteración un mapa

  1. Use GetStartPosition para llegar al principio del mapa y GetNextAssoc para obtener repetidamente la siguiente clave y el valor del mapa, como se muestra en el ejemplo siguiente:

    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 ejemplo usa una plantilla de mapa sencilla (en lugar de una colección de puntero con tipo) que usa claves de CString y almacena punteros a objetos CPerson . Cuando se usan funciones de acceso como GetNextAssoc, la clase proporciona punteros a CPerson objetos. Si en su lugar usa una de las colecciones de mapa que no está basada en plantillas, debe convertir el puntero CObject devuelto en un puntero a un CPerson.

    Nota:

    Para los mapas que no están basados en plantillas, el compilador requiere una referencia a un puntero CObject en el último parámetro para GetNextAssoc. En la entrada, debe convertir los punteros a ese tipo, como se muestra en el siguiente ejemplo.

    La solución de plantilla es más sencilla y ayuda a proporcionar una mejor seguridad tipográfica. El código de nontemplate es más complicado, como puede ver aquí:

    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 obtener más información, vea Eliminar todos los objetos de una colección CObject.

Consulte también

Colecciones