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
Ü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ındanCObArray
türetilir.GetAt
bir nesneyeCPerson
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 deyimininfor
alternatifi şudur:CPerson *thePerson = myArray[i];
Bu işleç hem hem de
const
olmayanconst
sürümlerde bulunur.const
Diziler içinconst
çağrılan sürüm yalnızca atama deyiminin sağ tarafında görünebilir.
Listeyi yinelemek için
Üye işlevlerini
GetHeadPosition
kullanın veGetNext
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ındanCObList
türetilir.GetNext
bir nesneyeCPerson
işaretçi döndürür.
Haritayı yinelemek için
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çileriCPerson
depolayan basit bir harita şablonu (yazılan işaretçi koleksiyonu yerine) kullanır. gibiGetNextAssoc
erişim işlevlerini kullandığınızda, sınıfı nesnelereCPerson
işaretçiler sağlar. Bunun yerine platform dışı eşleme koleksiyonlarından birini kullanırsanız, döndürülenCObject
işaretçiyi işaretçiyeCPerson
atamanız gerekir.Dekont
Ortak olmayan eşlemeler için derleyici, için son parametredeki bir
CObject
işaretçiyeGetNextAssoc
baş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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin