Aracılığıyla paylaş


Template-Based 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ürettiğiniz sınıfı belirtmenizi gerektirir — bu, MFC tarafından önceden tanımlanmış CPtrList veya CPtrArray gibi şablonsuz 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 fonksiyonları, tür güvenliğini sağlamak için temel sınıf üyelerine kapsüle edilmiş ç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:

  • int, char ve float gibi temel C++ veri türleri

  • 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 amacıyla ARG_TYPE parametresini kullanabilirsiniz. Genellikle, TYPE parametresinde adlandırdığınız türe başvuru olarak ARG_TYPE belirtirsiniz. Örneğin:

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 AddCArray ü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ı

CMap basit eşleme sınıfı 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'de 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 içinde belirtilen türe bir başvurudur. Örneğin:

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

İlk örnek, MY_STRUCT değerleri depolar, bunlara int anahtarlarla erişir ve MY_STRUCT öğeleri referansla erişerek döndürür. İkinci örnek CPerson değerlerini depolar, CString anahtarlarıyla erişir 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 CString türünde ve KEY_TYPE parametresi LPCSTR türünde olduğu için, anahtarlar haritada CString türünde öğeler olarak depolanır, ancak SetAt gibi işlevlerde LPCSTR türü işaretçilerle başvurulurlar. Örneğin:

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

Typed-Pointer 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.

Typed-Pointer Dizi ve Liste Kullanımı

Typed-pointer dizisi ve liste sınıfları, 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 ya CObArray ya da CPtrArray kullanın. Listeler için ya CObList ya da CPtrList kullanın.

Gerçekte, CObList örneğine dayalı bir koleksiyon bildirdiğinizde, yeni sınıf sadece temel sınıfının üyelerini devralmakla kalmaz, aynı zamanda temel sınıf üyelerine yapılan çağrıları kapsülleyerek tür güvenliği sağlamaya yardımcı olan bir dizi tür güvenli ek üye işlevi ve operatörü de bildirir. Bu kapsüllemeler tüm gerekli tür dönüştürmelerini yönetir. Örneğin:

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

Bu ilk örnek, myArray'den türetilmiş olarak, bir CObArray türünden işaretçi dizisi bildirir. Dizi, CPerson nesnelerine işaretçileri depolar ve döndürür (burada CPerson bir sınıf olup, CObject'den türetilmiştir). 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, myList'den türetilmiş tür işaretçi listesi bildirir. Liste, nesnelere MY_STRUCT yönelik işaretçileri depolar ve döndürür. CPtrList tabanlı bir sınıf, CObject'den türetilmemiş nesnelerin işaretçilerini depolamak için kullanılır. CTypedPtrList bir dizi tür güvenli üye işlevine sahiptir: GetHead, GetTail, RemoveHead, RemoveTail, GetNext, GetPrev ve GetAt.

Typed-Pointer Harita 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, CMapStringToPtr, CMapWordToPtr, , CMapStringToObvb. KEY, içindeki CMap ile benzerdir: Aramalar için kullanılan anahtarın türünü belirtir. VALUE, içindeki CMap ile benzerdir: Haritada depolanan nesne türünü belirtir. Örneğin:

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

İlk örnek CMapPtrToPtr temelinde bir haritadır, CString'den işaretçilere eşlenen anahtarları kullanır ve MY_STRUCT içerir. 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, CMapStringToOb tabanlı bir haritadır — CMyObject nesnelerine yönelik depolanan işaretçilere eşlenen dize anahtarlarını kullanır. Önceki paragrafta açıklanan aynı tür açısından güvenli olan üyeleri kullanabilir veya sınıf CMapStringToOb üyelerini çağırabilirsiniz.

Uyarı

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

Daha fazla bilgi için bkz. Type-Safe Koleksiyonu Yapma.

Ayrıca bakınız

Koleksiyonlar