Megosztás:


Template-Based osztályok

Ez a cikk az MFC 3.0-s és újabb verzióiban található, típusbiztos sablonalapú gyűjteményosztályokat ismerteti. Az ilyen sablonok használata a típusbiztos gyűjtemények létrehozásához kényelmesebb, és hatékonyabb típusbiztonságot biztosít, mint a nem sablonokon alapuló gyűjteményosztályok használata.

Az MFC előre definiálja a sablonalapú gyűjtemények két kategóriáját:

Az egyszerű gyűjteményosztályok az osztályból CObjectszármaznak, így öröklik a szerializálást, a dinamikus létrehozást és a többi tulajdonságot CObject. A beírt mutatógyűjteményi osztályokhoz meg kell adnia a származtatott osztályt, amely az MFC által előre definiált nem sablonos mutatógyűjtemények egyikének kell lennie, például CPtrList vagy CPtrArray. Az új gyűjteményosztály a megadott alaposztálytól öröklődik, és az új osztály tagfüggvényei beágyazott hívásokat használnak az alaposztály tagjaihoz a típusbiztonság kikényszerítése érdekében.

A C++ sablonokról további információt a C++ nyelvireferenciasablonok sablonjai című témakörben talál.

Egyszerű tömb-, lista- és térképsablonok használata

Az egyszerű gyűjteménysablonok használatához tudnia kell, hogy milyen típusú adatokat tárolhat ezekben a gyűjteményekben, és milyen paramétereket használhat a gyűjtemény deklarációiban.

Egyszerű tömb- és listahasználat

Az egyszerű tömb- és listaosztályok ( CArray és CList) két paramétert vesznek fel: TYPE és ARG_TYPE. Ezek az osztályok bármilyen adattípust tárolhatnak, amelyet a TYPE paraméterben ad meg:

  • Alapvető C++ adattípusok, például int: , charés float

  • C++ struktúrák és osztályok

  • Egyéb definiált típusok

A kényelem és a hatékonyság érdekében a ARG_TYPE paraméter használatával megadhatja a függvényargumentumok típusát. Általában ARG_TYPE a TYPE paraméterben megnevezett típusra mutató hivatkozásként adja meg. Például:

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

Az első példa egy **myArray**s tömbgyűjteményt intdeklarál. A második példa egy objektumokat tároló myList listagyűjteményt CPersondeklarál. A gyűjteményosztályok egyes tagfüggvényei olyan argumentumokat vesznek fel, amelyek típusát a ARG_TYPE sablonparaméter határozza meg. Az osztály Add tagfüggvénye például CArrayegy ARG_TYPE argumentumot használ:

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

Egyszerű térképhasználat

Az egyszerű térképosztály, a CMap négy paramétert vesz fel: KEY, ARG_KEY, VALUE és ARG_VALUE. A tömb- és listaosztályhoz hasonlóan a térképosztályok is bármilyen adattípust tárolhatnak. A tömböktől és listáktól eltérően, amelyek az általuk tárolt adatokat indexelik és rendezik, a térképek kulcsokat és értékeket társítanak: A térképen tárolt értékhez az érték társított kulcsának megadásával férhet hozzá. A KEY paraméter megadja a térképen tárolt adatok eléréséhez használt kulcsok adattípusát. Ha a KULCS típusa egy struktúra vagy osztály, a ARG_KEY paraméter általában a KEY-ben megadott típusra mutató hivatkozás. Az ÉRTÉK paraméter a térképen tárolt elemek típusát határozza meg. Ha a ARG_VALUE típusa egy struktúra vagy osztály, a ARG_VALUE paraméter általában az ÉRTÉK mezőben megadott típusra való hivatkozás. Például:

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

Az első példa tárolja az MY_STRUCT értékeket, int kulcsokkal éri el azokat, és hivatkozásként adja vissza a hozzáfért MY_STRUCT elemeket. A második példa értékeket tárol, kulcsokkal éri el őket, és visszaadja a hivatkozásokat a hozzáfért elemekre. Ez a példa egy egyszerű címjegyzéket jelölhet, amelyben vezetéknév alapján keres személyeket.

Mivel a KEY paraméter típusa CString, és a KEY_TYPE paraméter típusa LPCSTR, a kulcsok a térképen CString típusú elemekként tárolódnak, de a függvényekben, például a SetAt esetén, LPCSTR típusú mutatókon keresztül hivatkoznak rájuk. Például:

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

Typed-Pointer gyűjteménysablonok használata

A beírt mutatós gyűjteménysablonok használatához tudnia kell, hogy milyen típusú adatokat tárolhat ezekben a gyűjteményekben, és milyen paramétereket használhat a gyűjtemény deklarációiban.

Typed-Pointer tömb és lista használat

A beírt mutatós tömb és listaosztályok ( CTypedPtrArray és CTypedPtrList) két paramétert vesznek fel: BASE_CLASS és TYPE. Ezek az osztályok bármilyen adattípust tárolhatnak, amelyet a TYPE paraméterben ad meg. Ezek a mutatókat tároló nem adatgyűjteményi osztályok egyikéből származnak; ezt az alaposztályt adja meg a BASE_CLASS. Tömbök esetén használja a CObArray vagy a CPtrArray. Listák esetén használja a CObList vagy a CPtrList-t.

Ha például az CObList alapon új osztályt deklarál, az nemcsak az alaposztály tagjait örökli, hanem számos további típusbiztos tagfüggvényt és operátort is tartalmaz, amelyek az alaposztály tagjainak hívásait beágyazva segítenek a típusbiztonság megteremtésében. Ezek a beágyazások az összes szükséges típusátalakítást kezelik. Például:

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

Az első példa egy beírt mutatótömböt deklarál, myArrayamely a következőből CObArrayszármazik: . A tömb tárolja és visszaadja a mutatókat az CPerson objektumokhoz (ahol a CPerson egy, a CObject-ből származtatott osztály). Bármelyik tagfüggvényt meghívhatja CObArray , vagy meghívhatja az új típusbiztos GetAt és ElementAt függvényeket, vagy használhatja a type-safe [] operátort.

A második példa egy gépelt mutatós listát deklarál, ami a myList-ből származik. A lista tárolja és visszaadja a mutatókat az objektumoknak MY_STRUCT . Az CPtrList alapján létrehozott osztályt használják olyan objektumokra mutató mutatók tárolására, amelyek nem CObject-ből származnak. CTypedPtrListszámos típusbiztos tagfüggvénysel rendelkezik: GetHead, GetTail, , RemoveHeadRemoveTail, GetNext, GetPrevés GetAt.

Typed-Pointer térképhasználat

A CTypedPtrMap típusos mutatótérkép-osztály három paramétert vesz fel: BASE_CLASS, KEY és VALUE. A BASE_CLASS paraméter azt az osztályt adja meg, amelyből az új osztályt származtathatja: CMapPtrToWord, CMapPtrToPtr, CMapStringToPtr, CMapWordToPtr, CMapStringToObstb. A KULCS analóg a KULCS-sal CMap: Megadja a keresésekhez használt kulcs típusát. Az ÉRTÉK a következő értékhezCMaphasonló: A térképen tárolt objektum típusát adja meg. Például:

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

Az első példa egy térképet mutat be, amely a CMapPtrToPtr értékre épül — CString kulcsokat használ, amelyek MY_STRUCT mutatókhoz vannak rendelve. A tárolt mutatót egy típusbiztos Lookup tagfüggvény meghívásával keresheti meg. A [] operátorral megkeresheti a tárolt mutatót, és hozzáadhatja, ha nem található. A térképet pedig a típusbiztos GetNextAssoc függvénnyel is iterálhatja. Az osztály CMapPtrToPtr többi tagfüggvényét meghívhatja is.

A második példa egy térkép, amely CMapStringToOb alapján készült — sztring kulcsokat használ, amelyek az objektumokra mutató tárolt mutatókhoz CMyObject vannak leképezve. Használhatja az előző bekezdésben leírt típusbiztos tagokat, vagy meghívhatja az osztály CMapStringToObtagjait.

Megjegyzés:

Ha a class paraméterhez egy struct vagy típus van megadva, nem pedig a típushoz tartozó mutató vagy hivatkozás, akkor az osztálynak vagy a struktúrának rendelkeznie kell másolatkonstruktorral.

További információ : Hogyan készíthet Type-Safe gyűjteményt.

Lásd még

Gyűjtemények