Aracılığıyla paylaş


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

  1. Koleksiyon sınıfı türünün değişkenini bildirin. Örnek:

    CList<int, int> m_intList;
    
  2. Koleksiyon nesnesinin üye işlevlerini çağırın. Örnek:

    m_intList.AddTail(100);
    m_intList.RemoveAll();
    
  3. 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 GetAtgibi 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, CListve 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, CListve 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 CObjectiç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 , , UINTDWORDve CStringtürlerinin CObject*verilerini içermek için kullanılabilirler. 'den CObjecttü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:

  1. Gerekirse tür atamasıyla birlikte, platform dışı koleksiyonları kullanın. Bu daha kolay bir yaklaşımdır.

  2. Ortak olmayan bir tür-güvenli koleksiyondan türetilir ve genişletilir.

Tür ataması ile birlikte platform dışı koleksiyonları kullanmak için

  1. 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 CObjecttüretilen nesneleri tutmak için gibi CObListönceden tanımlanmış bir koleksiyon da kullanabilirsiniz. bir CObList koleksiyon işaretçilerini tutmak için CObjecttanımlanır. Listeden bir nesne aldığınızda, işlevler işaretçileri olarak döndüreceğinden CObList sonucu uygun türe CObjectatamanız gerekebilir. Örneğin, nesneleri bir CObList koleksiyonda depolarsanızCPerson, alınan bir öğeyi bir nesnenin CPerson işaretçisi olacak şekilde atamanız gerekir. Aşağıdaki örnek, nesneleri tutmak CPerson için bir CObList 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

  1. Ö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 'den CObList bir liste türetdiyseniz, sarmalayıcı işlevlerini AddHeadPerson ve GetHeadPersonaş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.

Ayrıca bkz.

Koleksiyonlar