Dezvoltarea sistemelor durabile

Funcția DBConnection :: crea () solicită Atașare (), astfel încât după finalizarea obiectului trebuie să elibereze conexiunea capturată apel în mod explicit detașați (). Notă: Clasa de DBClient gestionează, de asemenea, conexiunea folosind Destructori FEROVIARE La sfârșitul programului două obiecte DBClient reduce numărul de referință (apel funcții detachQ moștenite de la DBConnection numărabile). Conectarea la baza de date este închisă (datorită distrugerii virtuale Countable) atunci când contorul scade la zero după distrugerea obiectului c1.







Conectarea funcționalității prin moștenire este adesea realizată folosind șabloane astfel încât utilizatorul să poată selecta versiunea dorită la etapa de compilare. Acest lucru vă permite să utilizați diferite mecanisme de numărare de referință fără a redefini DBConnection. Iată cum se face:

Conectarea parametrizată a funcționalității

#ifndef DBCONNECTION H

# def1ne DBCONNECTION H

clasa DBConnection. baza de date publică, Counter public

DBConnection (const DBConnectionS): Nu copiați

DBConnectionSt operator = (const DBConnection): protejat:

DBConnection (const dbStr) aruncați (DatabaseError). Baza de date (dbStr) -DBConnectionO publice:

static DBConnection * șirul createCconst dbStr) arunca (DatabaseError)

DBConnection * con = DBConnection nou (dbStr):

afirma (con-> refCount () == 1): retur con:

Alte funcții necesare.

#endif DBC0NNECTI0N2 H III: -

Singura schimbare este apariția unui prefix de șablon în definiția clasei (și redenumirea numelui Countable to Counter pentru claritate). acces de clasă la baza de date ar putea fi, de asemenea, făcută într-un parametru de șablon (dacă am avut câteva clase de acces, din care au ales opțiunea dorită), dar de data aceasta clasa sa transformat complet independent. În exemplul următor, punerea în aplicare inițială numărabil a trecut ca un argument șablon, dar la fel de bine ar putea fi folosit orice tip care implementează interfața corespunzătoare (atașați (), detașați (), etc ...):







Conectarea funcționalității printr-un șablon

Atunci când moștenesc o clasă derivată, sunt incluse copii ale tuturor variabilelor din clasa de bază. Următorul program demonstrează posibila amplasare a mai multor obiecte de bază în memorie:

Plasarea subobiectelor în memorie

cu moștenire multiplă

folosind spațiul de nume std:

clasa C. public :

int mainO

cout c == c endl:

Tipul specific de rezultate depinde de compilator.

DBConnection* db: public:

DBClient (DBConnection* dbCon) atașați ():

int mainO * db =

DBConnection:: crea (MyDatabase): assert (DB> refCount () == 1): cl DBClient (db): assert (DB> refCount () == 2): c2 DBClient (db): assert (DB> refCount () == 3): db-> detach ():

afirmați (db-> refCount () == 2);> III: -

Modelul comun pentru mai multe module plug-in arată astfel:

tempiate

Subiect de clasă. public Mixinl.

Deși compilatorul nu ar fi detectat o eroare. Cu toate acestea, problema este rezolvată folosind operatorul dinamic - pentru detalii, consultați capitolul precedent.

A * ap = cu: B * bp = cu;

cout ar = = distribuție statică(ap) final:

cout bp == distribuție statică(bp) endl:

C * cp = turnare statică(Bp):

cout cp == distribuție statică(cp) endl:

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

/ * Rezultat: sizeof (A) == 4 s1zeof (B) == 4 sizeof (C) == 12 c == == 1245052 1245052 ap bp == cp == 1245056 1245052 bp == cp? adevărat 0

După cum puteți vedea, subobiectul B al obiectului c este la o distanță de 4 octeți de la începutul întregului obiect. Putem asuma următoarea structură de memorie:







Articole similare

Trimiteți-le prietenilor: