Condividi tramite


Le classi Basate su modelli

Questo articolo illustra le classi di raccolte basate su modelli indipendenti dai tipi nelle versioni di MFC 3,0 e versioni successive.Utilizzando questi modelli per creare raccolte indipendenti dai tipi è più efficace e le guide forniscono l'indipendenza dai tipi in modo efficace utilizzando le classi di raccolte non di base dei modelli.

MFC predefinisce due categorie di raccolte basate su modelli:

  • Matrice, elencare e classi semplici di mapping

    CArray, CList, CMap

  • Matrici, elenchi e mapping dei puntatori tipizzati

    CTypedPtrArray, CTypedPtrList, CTypedPtrMap

Le classi di raccolte semplici tutte sono derivate dalla classe CObject, in modo che ereditano la serializzazione, la creazione dinamica e altre proprietà di CObject.Le classi di raccolte tipizzate del puntatore è necessario specificare la classe che deriva da (che deve essere una delle raccolte del puntatore non template predefinite da MFC, come CPtrList o CPtrArray.La nuova classe di raccolte eredita dalla classe base specificata e dalle chiamate incapsulati utilizzo delle funzioni membro della nuova classe ai membri della classe base per imporre l'indipendenza dai tipi.

Per ulteriori informazioni sui modelli C++, vedere modelliin Riferimenti al linguaggio C++.

Utilizzo di matrice, elenco e modelli semplici di mapping

Per utilizzare i modelli di raccolte semplici, è necessario conoscere il tipo di dati è possibile archiviare in queste raccolte e i parametri da utilizzare nelle dichiarazioni di raccolta.

f728cbk3.collapse_all(it-it,VS.110).gifUtilizzo semplice elenco e di matrice

Le classi semplici di elenco e di matrice, CArray e CList, accettano due parametri: TYPE e ARG_TYPE.Queste classi possono memorizzare qualsiasi tipo di dati, specificata nel parametro di tipo :

  • Tipi di dati elementari C++, ad esempio int, chare float

  • Strutture e classi C++

  • Altri tipi che definiscono

Per praticità e efficienza, è possibile utilizzare il parametro di ARG_TYPE per specificare il tipo di argomenti della funzione.In genere, si specifica ARG_TYPE come riferimento al tipo che è denominato nel parametro di tipo .Di seguito è riportato un esempio:

CArray<int, int> myArray;
CList<CPerson, CPerson&> myList;

Il primo esempio viene dichiarata una raccolta di matrice, myArray, che contiene intS.Nel secondo esempio dichiara una raccolta di elenchi, myList, che archivia gli oggetti di CPerson .Alcune funzioni membro delle classi di raccolte accettano argomenti di tipo è specificato dal parametro di modello di ARG_TYPE .Ad esempio, la funzione membro di Aggiungi di classe CArray accetta un argomento di ARG_TYPE :

CArray<CPerson, CPerson&> personArr;
CPerson person;
personArr.Add(person);

f728cbk3.collapse_all(it-it,VS.110).gifUtilizzo semplice di mapping

La classe semplice di mapping, CMap, accetta quattro parametri: CHIAVE, ARG_KEY, VALOREe ARG_VALUE.Come le classi di elenco e di matrice, le classi di mapping possono memorizzare qualsiasi tipo di dati.A differenza delle matrici ed elenchi, che indice e richiedono dati che archiviano, il membro dei mapping imposta i valori e: Si accede a un valore archiviato in un mapping specificando la chiave associata del valore.Il parametro PRINCIPALE specifica il tipo di dati delle chiavi utilizzate per accedere ai dati memorizzati nella mappa.Se il tipo di CHIAVE è una struttura o una classe, il parametro di ARG_KEY è in genere un riferimento al tipo specificato in CHIAVE.Il parametro specifica il tipo degli elementi archiviati nella mappa.Se il tipo di ARG_VALUE è una struttura o una classe, il parametro di ARG_VALUE è in genere un riferimento al tipo specificato nel VALORE.Di seguito è riportato un esempio:

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

Il primo esempio l'archiviazione dei valori di MY_STRUCT , vi accede alle chiavi di int e restituisce gli elementi utilizzati di MY_STRUCT per riferimento.Nel secondo esempio l'archiviazione dei valori di CPerson , accede a esse da chiavi di CString e i riferimenti viene restituito agli elementi dell'accesso.Questo esempio potrebbe rappresentare la rubrica semplice, in cui cercare le persone in base al cognome.

Poiché il parametro PRINCIPALE è di tipo CString e il parametro di KEY_TYPE è di tipo LPCSTR, le chiavi sono memorizzate nel mapping come elementi di tipo CString ma viene fatto riferimento in funzioni come SetAt tramite puntatori di tipo LPCSTR.Di seguito è riportato un esempio:

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

Utilizzo dei modelli di libreria di Digitare-Puntatore

Per utilizzare i modelli di libreria di digitare-puntatore, è necessario conoscere i tipi di dati che è possibile archiviare in queste raccolte e i parametri da utilizzare nelle dichiarazioni di raccolta.

f728cbk3.collapse_all(it-it,VS.110).gifMatrice di Digitare-Puntatore e utilizzo di elenco

Le classi di matrice e dell'elenco di digitare-puntatore, CTypedPtrArray e CTypedPtrList, accettano due parametri: BASE_CLASS e TYPE.Queste classi possono memorizzare qualsiasi tipo di dati, specificata nel parametro di tipo .Vengono derivate dalle classi di raccolte non template che archivia i puntatori, si specifica questa classe base in BASE_CLASS.Per le matrici, utilizzare CObArray o CPtrArray.Per gli elenchi, utilizzare CObList o CPtrList.

In effetti, quando si dichiara una raccolta basata su, si supponga CObList, la nuova classe non solo eredita i membri della classe base, ma si dichiara una serie di funzioni membro e operatori indipendenti dai tipi che la guida viene garantita l'indipendenza dai tipi incapsulamento delle chiamate ai membri della classe base.Questi incapsulamenti gestiscono una conversione di tipi necessaria.Di seguito è riportato un esempio:

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

Il primo esempio viene dichiarata una matrice di digitare-puntatore, myArray, derivato da CObArray.La matrice file e restituisce i puntatori a oggetti di CPerson (dove CPerson è una classe derivata da CObject).È possibile chiamare qualsiasi funzione membro di CObArray , oppure chiamare nuovi GetAt e funzioni indipendenti dai tipi di ElementAt o utilizzare l'operatore indipendente dai tipi di [] .

Nel secondo esempio viene incluso un elenco di digitare-puntatore, myList, derivato da CPtrList.L'elenco file e restituisce i puntatori a oggetti di MY_STRUCT .Una classe basata su CPtrList viene utilizzato per memorizzare i puntatori a oggetti non derivati da CObject.CTypedPtrList dispone di una serie di funzioni membro indipendenti dai tipi: GetHead, GetTail, RemoveHead, RemoveTail, GetNext, GetPreve GetAt.

f728cbk3.collapse_all(it-it,VS.110).gifUtilizzo dei Digitare-Puntatore

La classe del mapping del digitare-puntatore, CTypedPtrMap, accetta tre parametri: BASE_CLASS, CHIAVEe VALORE.Il parametro di BASE_CLASS specifica la classe da cui derivare una nuova classe: CMapPtrToWord, CMapPtrToPtr, CMapStringToPtr, CMapWordToPtr, CMapStringToOb, e così via.La CHIAVE è analoga digitareCMap: Specifica il tipo della chiave utilizzata per ricerche.Il VALORE è analogo STIMARE inCMap: Specifica il tipo di oggetto archiviato nella mappa.Di seguito è riportato un esempio:

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

Il primo esempio è un mapping basato su CMapPtrToPtr — utilizza le chiavi di CString si esegue il mapping ai puntatori a MY_STRUCT.È possibile trovare un puntatore archiviato chiamando una funzione membro indipendente dai tipi di Lookup .È possibile utilizzare l'operatore di [] per trovare un puntatore archiviato e aggiungerlo se non trovato.Ed è possibile ripetere il mapping utilizzando la funzione indipendente dai tipi di GetNextAssoc .È possibile chiamare anche altre funzioni membro di classe CMapPtrToPtr.

Nel secondo esempio è un mapping basato su CMapStringToOb — utilizza le chiavi di stringa si esegue il mapping ai puntatori archiviati a oggetti di CMyObject .È possibile utilizzare gli stessi membri indipendenti dai tipi descritti nel paragrafo precedente, oppure chiamare i membri di classe CMapStringToOb.

[!NOTA]

Se si specifica un tipo di struct o di class per il parametro di valore , anziché un puntatore o un riferimento al tipo, la classe o la struttura deve avere un costruttore di copia.

Per ulteriori informazioni, vedere Come creare una raccolta indipendente dai tipi.

Vedere anche

Concetti

Raccolte