Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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ésfloatC++ 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.