Aracılığıyla paylaş


Bir Koleksiyonun Tüm Üyelerine Erişme

Hem şablon tabanlı hem de değil MFC dizi koleksiyonu sınıfları, öğelerine erişmek için dizinleri kullanır. Hem şablon tabanlı hem de değil MFC listesi ve eşleme koleksiyonu sınıfları, koleksiyondaki belirli bir konumu tanımlamak için POSITION türünde bir gösterge kullanır. Bu koleksiyonların bir veya daha fazla üyesine erişmek için önce konum göstergesini başlatırsınız ve sonra bu konumu tekrar tekrar koleksiyona geçirir ve sonraki öğeyi döndürmesini istersiniz. Koleksiyon, yinelemenin ilerleme durumuyla ilgili durum bilgilerini korumakla sorumlu değildir. Bu bilgiler konum göstergesinde tutulur. Ancak, belirli bir konum göz önüne alındığında, koleksiyon sonraki öğeyi döndürmekten sorumludur.

Aşağıdaki yordamlarda MFC ile sağlanan üç ana koleksiyon türünün nasıl yineileceği gösterilmektedir:

Diziyi yinelemek için

  1. Üye işleviyle GetAt sıralı dizin numaralarını kullanın:

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

    Bu örnekte, nesnelere yönelik işaretçiler CPerson içeren yazılı bir işaretçi dizisi kullanılır. Dizi, önceden tanımlanmış olmayan sınıflardan biri olan sınıfından CObArraytüretilir. GetAt bir nesneye CPerson işaretçi döndürür. Yazılan işaretçi koleksiyonu sınıfları (diziler veya listeler) için ilk parametre temel sınıfı belirtir; ikinci parametre, depoya alınacak türü belirtir.

    CTypedPtrArray sınıfı ayrıca [ ] işlecini aşırı yükler, böylece bir dizinin öğelerine erişmek için özel dizi-alt indis söz dizimini kullanabilirsiniz. Yukarıdaki döngünün gövdesindeki deyiminin for alternatifi şudur:

    CPerson *thePerson = myArray[i];
    

    Bu işleç hem hem de const olmayanconst sürümlerde bulunur. const Diziler için const çağrılan sürüm yalnızca atama deyiminin sağ tarafında görünebilir.

Listeyi yinelemek için

  1. Üye işlevlerini GetHeadPosition kullanın ve GetNext listede ilerleyin:

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

    Bu örnekte, nesnelere yönelik işaretçiler CPerson içeren bir yazılan işaretçi listesi kullanılır. Liste bildirimi, Bir diziyi yineleme yordamındaki diziye benzer, ancak sınıfından CObListtüretilir. GetNext bir nesneye CPerson işaretçi döndürür.

Haritayı yinelemek için

  1. Aşağıdaki örnekte gösterildiği gibi haritanın başına ulaşmak ve GetNextAssoc bir sonraki anahtarı ve değeri eşlemeden tekrar tekrar almak için kullanınGetStartPosition:

    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
    }
    

    Bu örnek, anahtarları kullanan CString ve nesnelere yönelik işaretçileri CPerson depolayan basit bir harita şablonu (yazılan işaretçi koleksiyonu yerine) kullanır. gibi GetNextAssocerişim işlevlerini kullandığınızda, sınıfı nesnelere CPerson işaretçiler sağlar. Bunun yerine platform dışı eşleme koleksiyonlarından birini kullanırsanız, döndürülen CObject işaretçiyi işaretçiye CPersonatamanız gerekir.

    Dekont

    Ortak olmayan eşlemeler için derleyici, için son parametredeki bir CObject işaretçiye GetNextAssocbaşvuru gerektirir. Girişte, sonraki örnekte gösterildiği gibi işaretçilerinizi bu türe dönüştürmeniz gerekir.

    Şablon çözümü daha basittir ve daha iyi tür güvenliği sağlamaya yardımcı olur. Burada görebileceğiniz gibi, platform dışı kod daha karmaşıktır:

    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 ...
    }
    

Daha fazla bilgi için bkz . CObject Koleksiyonundaki Tüm Nesneleri Silme.

Ayrıca bkz.

Koleksiyonlar