Condividi tramite


Procedura: Fare una raccolta indipendente dai tipi

In questo articolo illustra come eseguire le raccolte indipendenti dai tipi per i tipi di dati personalizzati.Gli argomenti trattati includono

  • Utilizzo di classi basate su modelli per garantire l'indipendenza dai tipi

  • Implementare le funzioni di supporto

  • Utilizzando le classi di raccolte non template

La libreria MFC fornisce le raccolte indipendenti dai tipi predefinite basate su modelli C++.Poiché sono modelli, queste classi garantiscono l'indipendenza dai tipi e facilità di utilizzo senza l'unione di caratteri e altro lavoro aggiuntivo implicato in utilizzando una classe non template per questo scopo.L'esempio In COLLECT di MFC viene illustrato l'utilizzo delle classi di raccolte basate su modelli in un'applicazione MFC.In genere è opportuno utilizzare queste classi ogni volta che si scrive nuovo codice di raccolte.

Utilizzo di classi Basate su modelli per garantire l'indipendenza dai tipi

Per utilizzare le classi basate su modelli

  1. Dichiarare una variabile di tipo classe di raccolte.Di seguito è riportato un esempio:

    CList<int, int> m_intList;
    
  2. Chiamare le funzioni membro dell'oggetto Collection.Di seguito è riportato un esempio:

    m_intList.AddTail(100);
    m_intList.RemoveAll();
    
  3. Se necessario, implementare funzioni di supporto e SerializeElements.Per informazioni sulla distribuzione di tali funzioni, vedere implementare le funzioni di supporto.

In questo esempio viene illustrata la dichiarazione di un elenco di numeri interi.Il primo parametro nel passaggio 1 è il tipo di dati archiviati come elementi di elenco.Il secondo parametro specifica al modo in cui i dati devono essere passati a essere restituiti da funzioni membro della classe di raccolte, come Aggiungi e GetAt.

Implementare le funzioni di supporto

Le classi di raccolte basate su modelli CArray, CListe funzioni di supporto globali di utilizzare cinque di CMap che è possibile personalizzare in base alle necessità della classe di raccolte derivata.Per informazioni su queste funzioni di supporto, vedere Supporto della classe di raccoltein riferimenti alla libreria MFC.L'implementazione della funzione di serializzazione è necessaria per la maggior parte dei utilizza le classi di raccolte basate su modelli.

6s70zdb8.collapse_all(it-it,VS.110).gifSerializzare gli elementi

CArray, CListe le classi di CMap chiamano SerializeElements per archiviare gli elementi della raccolta su o per leggerli in un archivio.

L'implementazione predefinita della funzione di supporto di SerializeElements esegue un'operazione bit per bit scrive dagli oggetti all'archivio, o da un bit per bit letto dall'archivio agli oggetti, come se gli oggetti sono archiviati in o in fase di recupero dall'archivio.Eseguire l'override di SerializeElements se questa operazione non è adatta.

Se la raccolta archivia gli oggetti derivati da CObject e utilizzare la macro di IMPLEMENT_SERIAL implementazione della classe dell'elemento della raccolta, è possibile sfruttare le funzionalità di serializzazione compilata in CArchive e in CObject:

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);
   }
}

Operatori di overload di inserimento per CArchive chiamano CObject::Serialize (o un override della funzione) per ogni oggetto di CPerson .

Utilizzando le classi di raccolte di non modello

MFC supporta inoltre le classi di raccolte introdotte nella versione 1,0 di MFC.Queste classi non sono basate su modelli.Possono essere utilizzate per contenere i dati dei tipi supportati CObject*, UINT, DWORDe CString.È possibile utilizzare queste raccolte predefinite (come CObList) per utilizzare le raccolte di tutti gli oggetti derivati da CObject.MFC fornisce anche altre raccolte predefinite per utilizzare i tipi primitivi quali UINT e puntatori a void (void*).In genere tuttavia, è spesso utile definire le proprie raccolte indipendenti dai tipi per utilizzare gli oggetti di una classe più specifica e delle classi derivate.Si noti che viene eseguita questa operazione con le classi di raccolte non basate su modelli è più lavoro che utilizzo di classi basate su modelli.

Esistono due modi per creare raccolte indipendenti dai tipi con le raccolte non template:

  1. Utilizzare le raccolte non template, con tipo che esegue il cast se necessario.Questo è il modo più semplice.

  2. Derivare da ed estendere una raccolta indipendente dai tipi non template.

Per utilizzare le raccolte non template con il cast del tipo

  • Utilizzare una delle classi non template, come CWordArray, direttamente.

    Ad esempio, è possibile creare CWordArray e aggiungere tutti i valori a 32 bit su, quindi vengono recuperate.Esiste alcuna operazione più scegliere.È sufficiente utilizzare la funzionalità predefinita.

    È inoltre possibile utilizzare una raccolta predefinita, come CObList, per contenere tutti gli oggetti derivati da CObject.Una raccolta di CObList è definita utilizzare i puntatori a CObject.Quando si recupera un oggetto dall'elenco, potrebbe essere necessario eseguire il cast del risultato al tipo corretto poiché le funzioni di CObList restituiscono puntatori a CObject.Ad esempio, se si archiviano gli oggetti di CPerson in una raccolta di CObList , è necessario eseguire il cast di un elemento recuperato sia un puntatore a un oggetto di CPerson .Nell'esempio seguente viene utilizzata una raccolta di CObList per utilizzare gli oggetti di CPerson :

    CPerson* p1 = new CPerson();
    CObList myList;
    
    myList.AddHead(p1);   // No cast needed
    CPerson* p2 = (CPerson*)myList.GetHead();
    

    Questa tecnica di utilizzare un tipo di raccolta predefinito e di eseguire il cast in base alle esigenze può risultare appropriata per molti dei requisiti di raccolta.Se è necessaria un'ulteriore funzionalità o di più indipendenza dai tipi, utilizzare una classe basata su modelli, o seguire la procedura descritta di seguito.

Per derivare da ed estendere una raccolta indipendente dai tipi non template

  • Derivare la classe di raccolte da una delle classi predefinite non template.

    Quando si deriva la classe, è possibile aggiungere funzioni wrapper indipendente dai tipi per fornire un'interfaccia indipendente dai tipi alle funzioni esistenti.

    Ad esempio, se derivaste un elenco da CObList per utilizzare gli oggetti di CPerson , è possibile aggiungere funzioni wrapper AddHeadPerson e GetHeadPerson, come illustrato di seguito.

    class CPersonList : public CObList
    {
    public:
        void AddHeadPerson( CPerson* person )
            {AddHead( person );}
    
        const CPerson* GetHeadPerson()
            {return (CPerson*)GetHead();}
    };
    

    Queste funzioni wrapper forniscono una modalità indipendente dai tipi aggiungere e recuperare gli oggetti di CPerson dall'elenco derivato.È possibile osservare che per la funzione di GetHeadPerson , è sufficiente si incapsulamento del cast del tipo.

    È inoltre possibile aggiungere la nuova funzionalità definendo nuove funzioni che estendono le funzionalità della raccolta anziché solo eseguendo il wrapping della funzionalità esistente in wrapper indipendente dai tipi.Ad esempio, l'articolo Eliminare tutti gli oggetti in una raccolta di CObject descrive una funzione per eliminare tutti gli oggetti contenuti in un elenco.Questa funzione può essere aggiunto alla classe derivata come funzione membro.

Vedere anche

Concetti

Raccolte