Aracılığıyla paylaş


Şablona Dayalı Sınıflar

Bu makalede, MFC sürüm 3.0 ve sonraki sürümlerde tür açısından güvenli şablon tabanlı koleksiyon sınıfları açıklanmaktadır. Tür açısından güvenli koleksiyonlar oluşturmak için bu şablonları kullanmak daha kullanışlıdır ve tür güvenliğinin şablonlara dayalı olmayan koleksiyon sınıflarını kullanmaya kıyasla daha etkili bir şekilde sağlanmasına yardımcı olur.

MFC, şablon tabanlı koleksiyonların iki kategorisini önceden tanımlar:

Basit koleksiyon sınıflarının tümü sınıfından CObjecttüretilir, bu nedenle serileştirme, dinamik oluşturma ve diğer özelliklerini CObjectdevralır. Yazılan işaretçi koleksiyonu sınıfları, türetdiğiniz sınıfı belirtmenizi gerektirir; bu, veya CPtrArraygibi CPtrList MFC tarafından önceden tanımlanmış olan platform dışı işaretçi koleksiyonlarından biri olmalıdır. Yeni koleksiyon sınıfınız belirtilen temel sınıftan devralır ve yeni sınıfın üye işlevleri, tür güvenliğini zorlamak için temel sınıf üyelerine kapsüllenmiş çağrılar kullanır.

C++ şablonları hakkında daha fazla bilgi için bkz. C++ Dil Başvurusundaki Şablonlar.

Basit Dizi, Liste ve Harita Şablonlarını Kullanma

Basit koleksiyon şablonlarını kullanmak için, bu koleksiyonlarda ne tür veriler depolayabileceğinizi ve koleksiyon bildirimlerinizde hangi parametreleri kullanacağınızı bilmeniz gerekir.

Basit Dizi ve Liste Kullanımı

Basit dizi ve liste sınıfları olan CArray ve CList, iki parametre alır: TYPE ve ARG_TYPE. Bu sınıflar, TYPE parametresinde belirttiğiniz herhangi bir veri türünü depolayabilir:

  • , charve gibi inttemel C++ veri türlerifloat

  • C++ yapıları ve sınıfları

  • Tanımladığınız diğer türler

Kolaylık ve verimlilik için, işlev bağımsız değişkenlerinin türünü belirtmek için ARG_TYPE parametresini kullanabilirsiniz. Genellikle, TYPE parametresinde adlandırdığınız türe başvuru olarak ARG_TYPE belirtirsiniz. Örnek:

CArray<int, int> myArray;
CList<CPerson, CPerson &> myList;

İlk örnek, myArray**int**s içeren bir dizi koleksiyonu bildirir. İkinci örnek, myListnesneleri depolayan CPerson bir liste koleksiyonu bildirir. Koleksiyon sınıflarının bazı üye işlevleri, türü ARG_TYPE şablon parametresi tarafından belirtilen bağımsız değişkenleri alır. Örneğin, sınıfın Add CArray üye işlevi ARG_TYPE bir bağımsız değişken alır:

CArray<CPerson, CPerson &> personArr;
CPerson person;
personArr.Add(person);

Basit Harita Kullanımı

Basit eşleme sınıfı CMap dört parametre alır: KEY, ARG_KEY, VALUE ve ARG_VALUE. Dizi ve liste sınıfları gibi eşleme sınıfları da herhangi bir veri türünü depolayabilir. Depoladıkları verilerin dizinini oluşturan ve sıralayan dizilerin ve listelerin aksine, anahtarları ve değerleri eşler: Değerin ilişkili anahtarını belirterek eşlemede depolanan bir değere erişirsiniz. KEY parametresi, haritada depolanan verilere erişmek için kullanılan anahtarların veri türünü belirtir. KEY türü bir yapı veya sınıfsa, ARG_KEY parametresi genellikle KEY içinde belirtilen türe bir başvurudur. VALUE parametresi, eşlemede depolanan öğelerin türünü belirtir. ARG_VALUE türü bir yapı veya sınıfsa, ARG_VALUE parametresi genellikle VALUE'de belirtilen türe bir başvurudur. Örnek:

CMap<int, int, MY_STRUCT, MY_STRUCT &> myMap1;
CMap<CString, LPCTSTR, CPerson, CPerson &> myMap2;

İlk örnek değerleri depolar MY_STRUCT , bunlara anahtarlarla erişir int ve başvuruya göre erişilen MY_STRUCT öğeleri döndürür. İkinci örnek değerleri depolar CPerson , bunlara anahtarlarla erişir CString ve erişilen öğelere başvurular döndürür. Bu örnek, kişileri soyadına göre arayabileceğiniz basit bir adres defterini temsil edebilir.

KEY parametresi türünde CString olduğundan ve KEY_TYPE parametresi türünde LPCSTRolduğundan, anahtarlar eşlemede türünde CString öğeler olarak depolanır, ancak türündeki işaretçiler LPCSTRgibi SetAt işlevlerde başvurulur. Örnek:

CMap<CString, LPCTSTR, CPerson, CPerson &> myMap;
CPerson person;
LPCTSTR lpstrName = _T("Jones");
myMap.SetAt(lpstrName, person);

Yazılan İşaretçi Koleksiyon Şablonlarını Kullanma

Yazılan işaretçi koleksiyon şablonlarını kullanmak için, bu koleksiyonlarda ne tür verileri depolayabileceğinizi ve koleksiyon bildirimlerinizde hangi parametreleri kullanacağınızı bilmeniz gerekir.

Yazılan İşaretçi Dizisi ve Liste Kullanımı

Typed-pointer dizisi ve liste sınıfları olan CTypedPtrArray ve CTypedPtrList iki parametre alır: BASE_CLASS ve TYPE. Bu sınıflar, TYPE parametresinde belirttiğiniz herhangi bir veri türünü depolayabilir. Bunlar, işaretçileri depolayan platform dışı koleksiyon sınıflarından birinden türetilir; bu temel sınıfı BASE_CLASS olarak belirtirsiniz. Diziler için veya CPtrArraykullanınCObArray. Listeler için veya CPtrListkullanınCObList.

Aslında, örneğine CObListdayalı bir koleksiyon bildirdiğinizde, yeni sınıf yalnızca temel sınıfının üyelerini devralmakla kalmaz, aynı zamanda temel sınıf üyelerine çağrıları kapsülleyerek tür güvenliği sağlamaya yardımcı olan bir dizi ek tür güvenli üye işlevi ve işleç de bildirir. Bu kapsüllemeler tüm gerekli tür dönüştürmelerini yönetir. Örnek:

CTypedPtrArray<CObArray, CPerson *> myArray;
CTypedPtrList<CPtrList, MY_STRUCT *> myList;

İlk örnek, myArraytüründen CObArraytüretilmiş bir işaretçi dizisi bildirir. Dizi, nesnelere CPerson işaretçiler depolar ve döndürür (burada CPerson öğesinden CObjecttüretilen bir sınıftır). Herhangi bir CObArray üye işlevini çağırabilir veya yeni tür-güvenli GetAt ve ElementAt işlevleri çağırabilir veya tür güvenli [ ] işlecini kullanabilirsiniz.

İkinci örnek, myListtüründen CPtrListtüretilmiş bir işaretçi listesi bildirir. Liste, nesnelere MY_STRUCT yönelik işaretçileri depolar ve döndürür. tabanlı CPtrList bir sınıf, öğesinden CObjecttüretilmemiş nesnelere yönelik işaretçileri depolamak için kullanılır. CTypedPtrListbir dizi tür güvenli üye işlevine sahiptir: , , , , , GetNext, GetPrevve GetAt. RemoveTailRemoveHeadGetTailGetHead

Yazılan İşaretçi Eşleme Kullanımı

CTypedPtrMap türündeki işaretçi eşleme sınıfı üç parametre alır: BASE_CLASS, KEY ve VALUE. BASE_CLASS parametresi, yeni sınıfın türetildiği sınıfı belirtir: CMapPtrToWord, CMapPtrToPtr, CMapWordToPtrCMapStringToPtr, , , CMapStringToObvb. KEY, içindeki CMapKEY ile benzerdir: Aramalar için kullanılan anahtarın türünü belirtir. VALUE, içindeki CMapDEĞER ile benzerdir: Eşlemede depolanan nesne türünü belirtir. Örnek:

CTypedPtrMap<CMapPtrToPtr, CString, MY_STRUCT*> myPtrMap;
CTypedPtrMap<CMapStringToOb, CString, CPerson*> myPersonMap;

İlk örnek, öğesini CMapPtrToPtr temel alan bir haritadır; işaretçileriyle MY_STRUCTeşlenen anahtarları kullanırCString. Tür açısından güvenli Lookup üye işlevini çağırarak depolanan bir işaretçiyi arayabilirsiniz. Depolanan bir işaretçiyi aramak ve bulunamazsa eklemek için [ ] işlecini kullanabilirsiniz. Ayrıca, tür açısından güvenli GetNextAssoc işlevini kullanarak haritayı yineleyebilirsiniz. sınıfının CMapPtrToPtrdiğer üye işlevlerini de çağırabilirsiniz.

İkinci örnek, temel alan CMapStringToOb bir eşlemedir; nesnelere yönelik depolanan işaretçilere CMyObject eşlenmiş dize anahtarlarını kullanır. Önceki paragrafta açıklanan tür açısından güvenli üyeleri kullanabilir veya sınıfının CMapStringToObüyelerini çağırabilirsiniz.

Dekont

Value parametresi için bir class işaretçi veya tür başvurusu yerine bir veya struct türü belirtirseniz, sınıfın veya yapının kopya oluşturucusunun olması gerekir.

Daha fazla bilgi için bkz. Tür Kasa Koleksiyonu Yapma.

Ayrıca bkz.

Koleksiyonlar