Nasıl yapılır: Tür Kullanımı Uyumlu Koleksiyon Yapma
Bu makalede, kendi veri türleriniz için tür açısından güvenli koleksiyonlar oluşturma açıklanmaktadır. Konu başlıkları şunlardır:
Microsoft Foundation Sınıf Kitaplığı, C++ şablonlarını temel alan önceden tanımlanmış tür güvenli koleksiyonlar sağlar. Bunlar şablon olduğundan, bu sınıflar tür ataması olmadan tür güvenliği ve kullanım kolaylığı sağlamaya yardımcı olur ve bu amaç için platform olmayan bir sınıfın kullanılmasıyla ilgili diğer ek işleri sağlar. MFC örneği COLLECT , bir MFC uygulamasında şablon tabanlı koleksiyon sınıflarının kullanımını gösterir. Genel olarak, yeni koleksiyon kodu yazdığınızda bu sınıfları kullanın.
Tür Kasa ty için Şablon Tabanlı Sınıfları Kullanma
Şablon tabanlı sınıfları kullanmak için
Koleksiyon sınıfı türünün değişkenini bildirin. Örnek:
CList<int, int> m_intList;
Koleksiyon nesnesinin üye işlevlerini çağırın. Örnek:
m_intList.AddTail(100); m_intList.RemoveAll();
Gerekirse yardımcı işlevleri ve SerializeElements'i uygulayın. Bu işlevleri uygulama hakkında bilgi için bkz . Yardımcı İşlevleri Uygulama.
Bu örnek, tamsayı listesinin bildirimini gösterir. 1. adımdaki ilk parametre, listenin öğeleri olarak depolanan veri türüdür. İkinci parametre, verilerin ve GetAt
gibi Add
koleksiyon sınıfının üye işlevlerine nasıl geçirilip döndürüleceklerini belirtir.
Yardımcı İşlevleri Uygulama
Şablon tabanlı koleksiyon sınıfları CArray
, CList
ve CMap
türetilmiş koleksiyon sınıfınız için gerektiğinde özelleştirebileceğiniz beş genel yardımcı işlevi kullanır. Bu yardımcı işlevler hakkında bilgi için bkz. MFC Başvurusundaki Koleksiyon Sınıfı Yardımcıları. Serileştirme işlevinin uygulanması, şablon tabanlı koleksiyon sınıflarının çoğu kullanımı için gereklidir.
Öğeleri Seri Hale Getirme
CArray
, CList
ve CMap
sınıfları, koleksiyon öğelerini arşive depolamak veya arşivden okumak için çağrısında SerializeElements
bulunur.
Yardımcı işlevinin SerializeElements
varsayılan uygulaması, nesnelerden arşive bit düzeyinde yazma veya nesnelerin arşivde depolanıp depolanmadığına veya arşivden alınmasına bağlı olarak arşivden nesnelere bit düzeyinde okuma yapar. Bu eylem uygun değilse geçersiz kılın SerializeElements
.
Koleksiyonunuz öğesinden CObject
türetilen nesneleri depolarsa ve makroyu IMPLEMENT_SERIAL
koleksiyon öğesi sınıfının uygulamasında kullanırsanız, ve CObject
içinde yerleşik olarak bulunan CArchive
serileştirme işlevinden yararlanabilirsiniz:
CArray< CPerson, CPerson& > personArray;
template <> void AFXAPI SerializeElements <CPerson>(CArchive& ar,
CPerson* pNewPersons, INT_PTR nCount)
{
for (int i = 0; i < nCount; i++, pNewPersons++)
{
// Serialize each CPerson object
pNewPersons->Serialize(ar);
}
}
Her CPerson
nesne için CArchive
çağrı CObject::Serialize
(veya bu işlevin geçersiz kılınması) için aşırı yüklenmiş ekleme işleçleri.
Ortak Olmayan Koleksiyon Sınıflarını Kullanma
MFC, MFC sürüm 1.0 ile sunulan koleksiyon sınıflarını da destekler. Bu sınıflar şablonlara dayalı değildir. Desteklenen , , UINT
DWORD
ve CString
türlerinin CObject*
verilerini içermek için kullanılabilirler. 'den CObject
türetilen nesnelerin koleksiyonlarını tutmak için bu önceden tanımlanmış koleksiyonları (örneğinCObList
) kullanabilirsiniz. MFC, ve void işaretçileri (void*
gibi UINT
temel türleri tutmak için önceden tanımlanmış diğer koleksiyonlar da sağlar. Ancak genel olarak, daha belirli bir sınıfın ve türevlerinin nesnelerini tutmak için kendi tür güvenli koleksiyonlarınızı tanımlamak genellikle yararlıdır. Şablonları temel almayan koleksiyon sınıfları ile bunu yapmak, şablon tabanlı sınıfları kullanmaktan daha fazla iştir.
Platform olmayan koleksiyonlarla tür açısından güvenli koleksiyonlar oluşturmanın iki yolu vardır:
Gerekirse tür atamasıyla birlikte, platform dışı koleksiyonları kullanın. Bu daha kolay bir yaklaşımdır.
Ortak olmayan bir tür-güvenli koleksiyondan türetilir ve genişletilir.
Tür ataması ile birlikte platform dışı koleksiyonları kullanmak için
Doğrudan gibi
CWordArray
, ortak olmayan sınıflardan birini kullanın.Örneğin, bir
CWordArray
oluşturabilir ve buna 32 bit değerleri ekleyebilir ve sonra bunları alabilirsiniz. Yapacak başka bir şey yok. Yalnızca önceden tanımlanmış işlevselliği kullanırsınız.'den
CObject
türetilen nesneleri tutmak için gibiCObList
önceden tanımlanmış bir koleksiyon da kullanabilirsiniz. birCObList
koleksiyon işaretçilerini tutmak içinCObject
tanımlanır. Listeden bir nesne aldığınızda, işlevler işaretçileri olarak döndüreceğindenCObList
sonucu uygun türeCObject
atamanız gerekebilir. Örneğin, nesneleri birCObList
koleksiyonda depolarsanızCPerson
, alınan bir öğeyi bir nesneninCPerson
işaretçisi olacak şekilde atamanız gerekir. Aşağıdaki örnek, nesneleri tutmakCPerson
için birCObList
koleksiyon kullanır:CPerson* p1 = new CPerson(); CObList myList; myList.AddHead(p1); // No cast needed CPerson* p2 = (CPerson*)myList.GetHead();
Önceden tanımlanmış bir koleksiyon türü kullanma ve gerektiğinde atama tekniği, koleksiyon gereksinimlerinizin çoğu için yeterli olabilir. Daha fazla işlevselliğe veya daha fazla tür güvenliğine ihtiyacınız varsa şablon tabanlı bir sınıf kullanın veya sonraki yordamı izleyin.
Ortak olmayan tür güvenli koleksiyonu türetmek ve genişletmek için
Önceden tanımlanmış platform olmayan sınıflardan birinden kendi koleksiyon sınıfınızı türetin.
Sınıfınızı türetdiğinizde, var olan işlevlere tür açısından güvenli bir arabirim sağlamak için tür güvenli sarmalayıcı işlevleri ekleyebilirsiniz.
Örneğin, nesneleri tutmak
CPerson
için 'denCObList
bir liste türetdiyseniz, sarmalayıcı işlevleriniAddHeadPerson
veGetHeadPerson
aşağıda gösterildiği gibi ekleyebilirsiniz.class CPersonList : public CObList { public: void AddHeadPerson(CPerson* person) { AddHead(person); } const CPerson* GetHeadPerson() { return (CPerson*)GetHead(); } };
Bu sarmalayıcı işlevleri türetilmiş listeden nesne eklemek ve almak
CPerson
için tür güvenli bir yol sağlar. İşlev için tür atamasınıGetHeadPerson
kapsüllediğiniz görebilirsiniz.Ayrıca, var olan işlevleri yalnızca tür açısından güvenli sarmalayıcılara sarmalamak yerine koleksiyonun özelliklerini genişleten yeni işlevler tanımlayarak yeni işlevler ekleyebilirsiniz. Örneğin, CObject Koleksiyonundaki Tüm Nesneleri Silme makalesinde, bir listedeki tüm nesneleri silmeye yönelik bir işlev açıklanır. Bu işlev, türetilmiş sınıfa üye işlevi olarak eklenebilir.