A fenntartható rendszerek fejlesztése

A DBConnection :: create () függvény hívja a attach () függvényt, így miután befejezte az objektummal való munkavégzést, meg kell szabadítania a rögzített kapcsolatot kifejezetten a detach () meghívásával. Megjegyzés: DBClient osztály kezeli a kapcsolatot a vasúti közlekedést destruktorok végén a program két tárgy DBClient csökkenti a referencia szám (hívás detachQ funkciók örökölt DBConnection Megszámlálható). Az adatbázishoz való kapcsolódás zárt (a virtuális diszkrét számláló miatt), amikor a számláló nullára esik, miután megsemmisítette a c1 objektumot.

A funkcionalitás örökléssel történő összekapcsolása gyakran sablonokkal történik, így a felhasználó kiválaszthatja a kívánt verziót a fordítási szakaszban. Ez lehetővé teszi a referenciaszámlálás különböző mechanizmusainak használatát a DBConnection újbóli meghatározása nélkül. Íme, hogyan kell csinálni:

A funkcionalitás paraméterezett csatlakoztatása

#ifndef DBCONNECTION H

# def1ne DBCONNECTION H

osztályú DBConnection. nyilvános adatbázis, nyilvános számláló

DBConnection (const DBConnectionS): Ne másolja

DBConnectionSt operator = (const DBConnection): védett:

DBConnection (const string dbStr) dob (DatabaseError). Adatbázis (dbStr) -DBConnectionO nyilvános:

statikus DBConnection * createCconst string dbStr) dob (DatabaseError)

DBConnection * con = új DBConnection (dbStr):

assert (con-> refCount () == 1): return con:

Egyéb szükséges funkciók.

#endif DBC0NNECTI0N2 H III: -

Az egyetlen változás a sablon előtag megjelenése az osztálydefinícióban (és a számláló számlálójának átszámozása az egyértelműség érdekében). Osztály az adatbázishoz való hozzáférés is kell tenni egy sablonparaméterrel (ha volt néhány osztály a hozzáférés, melyek közül választott ki a kívánt opciót), de ezúttal az osztály már teljesen független. A következő példában, a végrehajtás első Megszámlálható telt, mint a sablon érv, de ugyanúgy lehet használni bármilyen típusú, amely megvalósítja a megfelelő interfész (csatolja (), le (), stb ...):

Csatlakoztatás a sablonon keresztül

Ha egy származtatott osztály örököl, a bázis osztály összes változójának másolatai szerepelnek. A következő program bemutatja a több alapvető alobjektum lehetséges elhelyezését a memóriában:

Subobjektumok elhelyezése a memóriában

több örökséggel

a névtér std használata:

C. osztály nyilvános A. public In :

int mainO

cout c == c endl:

Az egyes fajta eredmények a fordítótól függenek.

DBConnection* db: nyilvános:

DBClient (DBConnection* dbCon) csatolja ():

int mainO * db =

DBConnection:: létre (MyDatabase): assert (db-> refCount () == 1): DBClient cl (dB): assert (db-> refCount () == 2): DBClient c2 (dB): assert (db-> refCount () == 3): db-> leválaszt ():

assert (db-> refCount () == 2);> III: -

A többféle plug-in osztály közös mintája így néz ki:

tempiate

osztály Tárgy. nyilvános Mixinl.

Bár a fordító nem talált hibát. A probléma azonban megoldható a dinamikus operátor használatával - a részleteket lásd az előző fejezetben.

A * ap = a következővel: B * bp = e;

cout ar == statikus öntött(ap) endl:

cout bp == statikus leadás(bp) endl:

C * cp = statikus öntött(Bp):

cout cp == statikus leadás(cp) endl:

cout bp == cp? boolalpha (bp == cp) endl:

/ * Eredmény: sizeof (A) == 4 s1zeof (B) == 4 sizeof (C) == 12 c == 1245052 ap == 1245052 bp == 1245056 cp == 1245052 bp == cp? igaz 0

Amint láthatja, a c objektum b alobjektuma a teljes objektum kezdetétől 4 bájtnyi távolságra van. A következő memória struktúrát feltételezzük:

Kapcsolódó cikkek