Példa konténerosztályra

Ez a rész a Visual C ++ dokumentációban található, mint a standard C ++ könyvtárban használt tárolók nem működő példája. További információért lásd az STL konténereket.

Leírja egy olyan objektumot, amely szabályozza az elemek sorrendjét, általában az Ty típusú változót. A szekvenciát a tényleges tartálytól függően különböző módon tárolják.

Ez lehet egy konténer konstruktor vagy tagfüggvény, a konstruktornak ritka esetekben hívja Ty (const Ty ) vagy Ty :: operator = (const Ty ). Ha egy ilyen hívás kivételt hoz létre, akkor a konténerobjektum köteles megőrizni az integritást és újra létrehozni a kivételeket. A tartályobjektumot biztonságosan lecserélheti, hozzárendelheti, törölheti vagy megsemmisítheti, miután létrehozta az egyik ilyen kivételt. Általában azonban nem lehetséges előre megjósolni a tárolóobjektum által vezérelt szekvencia állapotát.

Néhány további figyelmeztetés:

Ty létrehozta a kivételt, a tárolóobjektum létrehozott állapota nincs meghatározva.

Ha az elosztóobjektumot tároló konténer al. és az al egy kivételt jelent, amely eltér az alosztályhívástól. a tárolóobjektum létrehozott állapota nincs meghatározva.

Ha a tároló tárolja a funkció objektum comp. A kezelt szekvencia sorrendjének meghatározásához, és a comp kivételtípusok kivételével a konténerobjektum állapota nem definiált.

Az STL által meghatározott konténerosztályok több további követelményt is kielégítenek, a következő bekezdésekben leírtak szerint.

A listatároló sablon osztály olyan determinisztikus és hasznos viselkedést nyújt, még a fent leírt kivételekkel együtt. Például, ha egy kivétel történik egy vagy több tárolóelem beszúrásakor, és a kivétel újra létrejön.

Az STL által definiált összes konténerosztály esetén, ha a kivétel a következő tagfunkciók hívásakor történik:

A tagfunkció csak akkor törli a kivételt, ha a másolási művelet (hozzárendelési vagy másolási konstrukció) kivételt tesz.

Ezenkívül egy kivétellel nem történik a member funkció által visszaadott iterátor másolása.

A tag-helyettesítő funkció további előnyökkel jár minden meghatározott STL konténerosztályhoz:

A tag csak akkor működik, ha a konténer egy al elosztó objektumot tárol, kivételt dob, és al másolatot hív le másoláskor.

Azok a linkek, mutatók és iterátorok, amelyek a kezelt sorrend elemeit jelölik átváltással, továbbra is érvényesek.

Az STL által definiált konténerosztály objektum kiosztja és kiadja a tárolást a sorozathoz, amelyet egy Alloc típusú tárolt objektumon keresztül kezel. amely rendszerint egy sablon paraméter. Az ilyen elosztó objektumnak ugyanaz a külső interfésze kell, hogy legyen, mint az osztó osztályobjektuma . Különösen az Alloc-nak ugyanolyan típusúnak kell lennie, mint az Alloc :: rebind . más

Minden konténerosztály esetében az STL definiált, a member function get_allocator Alloc const; visszaadja a mentett elosztási objektum másolatát. Ne feledje, hogy a mentett elosztási objektum nem kerül másolásra, ha a konténerobjektum hozzá van rendelve. Minden konstruktor inicializálja az allokátorban tárolt értéket. Alloc-ban Ha a konstruktor nem allokálási paramétert tartalmaz.

A C ++ szabvány szerint az STL által definiált konténerosztály feltételezhetően:

Az Alloc-osztály minden tárgya összehasonlítja az egyenlőséget.

Az Alloc :: const_pointer típus megegyezik a const Ty * értékkel.

Típus Alloc :: const_reference ugyanaz, mint a const Ty .

Azonban ebben a megvalósításban a konténerek nem tesznek ilyen egyszerűsítő feltételezéseket. Így helyesen működnek az allokáló objektumokkal, amelyek jelentősebbek:

Az Alloc osztály minden objektumát nem kell egyenlővé tenni. (Több médiatámogatást is támogathat).

Az Alloc :: const_pointer típus nem lehet ugyanaz, mint a const Ty *. (Egy állandó pointer lehet osztály.)

Az Alloc :: pointer típus nem lehet ugyanaz, mint a Ty *. (A mutató lehet osztály.)

Kapcsolódó cikkek