Classi basate su modello

Questo articolo illustra le classi di raccolta basate su modelli indipendenti dai tipi in MFC versione 3.0 e successive. L'uso di questi modelli per creare raccolte indipendenti dai tipi è più pratico e consente di garantire sicurezza dei tipi in modo più efficace rispetto all'uso delle classi di raccolta non basate sui modelli.

MFC consente di predefinito due categorie di raccolte basate su modelli:

Le classi di raccolta semplici sono tutte derivate dalla classe CObject, quindi ereditano la serializzazione, la creazione dinamica e altre proprietà di CObject. Le classi di raccolta di puntatori tipizzato richiedono di specificare la classe da cui derivare , che deve essere una delle raccolte di puntatori non amplate predefinite da MFC, ad esempio CPtrList o CPtrArray. La nuova classe di raccolta eredita dalla classe base specificata e le funzioni membro della nuova classe usano chiamate incapsulate ai membri della classe base per applicare la sicurezza dei tipi.

Per altre informazioni sui modelli C++, vedere Modelli nella Guida di riferimento al linguaggio C++.

Uso di modelli di matrice, elenco e mappa semplici

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

Utilizzo semplice di matrici ed elenchi

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

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

  • Strutture e classi C++

  • Altri tipi definiti

Per praticità ed efficienza, è possibile usare il parametro ARG_TYPE per specificare il tipo di argomenti della funzione. In genere, si specifica ARG_TYPE come riferimento al tipo denominato nel parametro TYPE . Ad esempio:

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

Il primo esempio dichiara una raccolta di matrici, myArray, che contiene **int**s. Il secondo esempio dichiara un insieme di elenchi, myList, che archivia CPerson gli oggetti . Alcune funzioni membro delle classi di raccolta accettano argomenti il cui tipo è specificato dal parametro di modello ARG_TYPE . Ad esempio, la Add funzione membro della classe CArray accetta un argomento ARG_TYPE :

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

Utilizzo semplice della mappa

La semplice classe map, CMap, accetta quattro parametri: KEY, ARG_KEY, VALUE e ARG_VALUE. Analogamente alle classi di matrice e elenco, le classi della mappa possono archiviare qualsiasi tipo di dati. A differenza delle matrici e degli elenchi, che indicizzano e ordinano i dati archiviati, esegue il mapping di chiavi e valori: si accede a un valore archiviato in una mappa specificando la chiave associata del valore. Il parametro KEY specifica il tipo di dati delle chiavi usate per accedere ai dati archiviati nella mappa. Se il tipo di KEY è una struttura o una classe, il parametro ARG_KEY è in genere un riferimento al tipo specificato in KEY. Il parametro VALUE specifica il tipo degli elementi archiviati nella mappa. Se il tipo di ARG_VALUE è una struttura o una classe, il parametro ARG_VALUE è in genere un riferimento al tipo specificato in VALUE. Ad esempio:

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

Il primo esempio archivia MY_STRUCT i valori, li accede in int base alle chiavi e restituisce gli elementi a cui si MY_STRUCT accede per riferimento. Il secondo esempio archivia CPerson i valori, li accede tramite CString chiavi e restituisce riferimenti agli elementi a cui si accede. Questo esempio può rappresentare una semplice rubrica in cui si cercano le persone in base al cognome.

Poiché il parametro KEY è di tipo CString e il parametro KEY_TYPE è di tipo LPCSTR, le chiavi vengono archiviate nella mappa come elementi di tipo CString , ma fanno riferimento a funzioni come SetAt puntatori di tipo LPCSTR. Ad esempio:

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

Uso di modelli di raccolta puntatore tipizzato

Per usare i modelli di raccolta dei puntatori tipizzato, è necessario conoscere i tipi di dati che è possibile archiviare in queste raccolte e quali parametri usare nelle dichiarazioni di raccolta.

Matrice di puntatori tipizzato e utilizzo elenco

La matrice di puntatori tipizzato e le classi di elenco, CTypedPtrArray e CTypedPtrList accettano due parametri: BA edizione Standard_CLASS e TYPE. Queste classi possono archiviare qualsiasi tipo di dati, specificato nel parametro TYPE . Sono derivati da una delle classi di raccolta nontemplate che archivia i puntatori; specificare questa classe di base in BA edizione Standard_CLASS. Per le matrici, usare CObArray o CPtrArray. Per gli elenchi, usare CObList o CPtrList.

In effetti, quando si dichiara una raccolta basata su , ad esempio CObList, la nuova classe non solo eredita i membri della relativa classe base, ma dichiara anche una serie di funzioni membro e operatori aggiuntivi indipendenti dai tipi che consentono di garantire la sicurezza dei tipi incapsulando le chiamate ai membri della classe base. Questi incapsulamenti gestiscono tutte le conversioni dei tipi necessarie. Ad esempio:

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

Il primo esempio dichiara una matrice di puntatori tipizzata, , myArrayderivata da CObArray. La matrice archivia e restituisce puntatori agli CPerson oggetti (dove CPerson è una classe derivata da CObject). È possibile chiamare qualsiasi CObArray funzione membro oppure chiamare le nuove funzioni e ElementAt indipendenti GetAt dai tipi oppure usare l'operatore type-safe [ ] .

Il secondo esempio dichiara un elenco di puntatori tipizzato, myList, derivato da CPtrList. L'elenco archivia e restituisce puntatori agli MY_STRUCT oggetti . Una classe basata su CPtrList viene usata per archiviare puntatori a oggetti non derivati da CObject. CTypedPtrListdispone di una serie di funzioni membro indipendenti dai tipi: GetHead, , GetTailRemoveHead, GetNextRemoveTail, GetPrev, e GetAt.

Utilizzo mappa puntatore tipizzato

La classe mappa puntatore tipizzata, CTypedPtrMap, accetta tre parametri: BA edizione Standard_CLASS, KEY e VALUE. Il parametro BA edizione Standard_CLASS specifica la classe da cui derivare la nuova classe: CMapPtrToWord, CMapPtrToPtr, CMapStringToPtrCMapWordToPtr, CMapStringToOb, e così via. KEY è analogo a KEY in CMap: specifica il tipo della chiave usata per le ricerche. VALUE è analogo a VALUE in CMap: specifica il tipo di oggetto archiviato nella mappa. Ad esempio:

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

Il primo esempio è una mappa basata su CMapPtrToPtr , che usa CString le chiavi mappate ai puntatori a MY_STRUCT. È possibile cercare un puntatore archiviato chiamando una funzione membro indipendente dai Lookup tipi. È possibile usare l'operatore [ ] per cercare un puntatore archiviato e aggiungerlo se non trovato. Ed è possibile scorrere la mappa usando la funzione indipendente GetNextAssoc dai tipi. È anche possibile chiamare altre funzioni membro della classe CMapPtrToPtr.

Il secondo esempio è una mappa basata su CMapStringToOb , che usa chiavi stringa mappate ai puntatori archiviati agli CMyObject oggetti. È possibile usare gli stessi membri indipendenti dai tipi descritti nel paragrafo precedente oppure chiamare membri della classe CMapStringToOb.

Nota

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

Per altre informazioni, vedere How to Make a Type-Cassaforte Collection.For more information, see How to Make a Type-Cassaforte Collection.

Vedi anche

Raccolte