Ş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 dizi, liste ve eşleme sınıfları
CArray
,CList
,CMap
Yazılan işaretçilerin dizileri, listeleri ve eşlemeleri
CTypedPtrArray
,CTypedPtrList
,CTypedPtrMap
Basit koleksiyon sınıflarının tümü sınıfından CObject
türetilir, bu nedenle serileştirme, dinamik oluşturma ve diğer özelliklerini CObject
devralır. Yazılan işaretçi koleksiyonu sınıfları, türetdiğiniz sınıfı belirtmenizi gerektirir; bu, veya CPtrArray
gibi 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:
,
char
ve gibiint
temel 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, myList
nesneleri 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 LPCSTR
olduğundan, anahtarlar eşlemede türünde CString
öğeler olarak depolanır, ancak türündeki işaretçiler LPCSTR
gibi 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 CPtrArray
kullanınCObArray
. Listeler için veya CPtrList
kullanınCObList
.
Aslında, örneğine CObList
dayalı 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, myArray
türünden CObArray
türetilmiş bir işaretçi dizisi bildirir. Dizi, nesnelere CPerson
işaretçiler depolar ve döndürür (burada CPerson
öğesinden CObject
tü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, myList
türünden CPtrList
tü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 CObject
türetilmemiş nesnelere yönelik işaretçileri depolamak için kullanılır. CTypedPtrList
bir dizi tür güvenli üye işlevine sahiptir: , , , , , GetNext
, GetPrev
ve GetAt
. RemoveTail
RemoveHead
GetTail
GetHead
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
, CMapWordToPtr
CMapStringToPtr
, , , CMapStringToOb
vb. KEY, içindeki CMap
KEY ile benzerdir: Aramalar için kullanılan anahtarın türünü belirtir. VALUE, içindeki CMap
DEĞ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_STRUCT
eş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 CMapPtrToPtr
diğ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.