Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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
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 claseCObArray
, una de las clases predefinidas nontemplate.GetAt
devuelve un puntero a unCPerson
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 buclefor
anterior esCPerson *thePerson = myArray[i];
Este operador existe tanto en versiones
const
como en versiones sinconst
. La versiónconst
, que se invoca para las matricesconst
, puede aparecer solo en el lado derecho de una instrucción de asignación.
Para recorrer en iteración una lista
Utiliza las funciones miembro
GetHeadPosition
yGetNext
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 claseCObList
.GetNext
devuelve un puntero a unCPerson
objeto .
Para recorrer en iteración un mapa
Use
GetStartPosition
para llegar al principio del mapa yGetNextAssoc
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 objetosCPerson
. Cuando se usan funciones de acceso comoGetNextAssoc
, la clase proporciona punteros aCPerson
objetos. Si en su lugar usa una de las colecciones de mapa que no está basada en plantillas, debe convertir el punteroCObject
devuelto en un puntero a unCPerson
.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 paraGetNextAssoc
. 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.