shared_ptr
Lo smart pointer shared_ptr é reference counted allo scopo di permettere la condivisione dell'oggetto sottostante tra diverse istanze. Il distruttore dell'oggetto viene chiamato quando il reference count scende a zero.
Ecco un esempio con shared_ptr:
#include<iostream>
#include<boost/shared_ptr.hpp>
using namespace std;
using namespace boost;
class A {
shared_ptr<int> no_;
public:
A(shared_ptr<int> no) : no_(no) {
}
void value(int i) {
*no_ = i;
}
};
class B {
shared_ptr<int> no_;
public:
B(shared_ptr<int> no) : no_(no) {
}
int value() const {
return *no_;
}
};
int main() {
shared_ptr<int> temp(new int(14));
if (temp.unique())
cout << "Unique" << endl;
A a(temp);
if (temp.unique() == false)
cout << "Not anymore unique" << endl;
B b(temp);
cout << "Reference count now is " << temp.use_count() << endl;
temp.reset();
a.value(28);
cout << "b value now is " << b.value() << endl;
}
Definiamo due classi che usano al loro interno un shared_ptr che viene creato per copia.
Nel main creiamo temp, un shared_ptr, verifichiamo che la risorsa sottostante sia inzialmente unica; creiamo un oggetto A, passando una copia di temp, verifichiamo che il reference count sia stato incrementato, unique() é ora false, creiamo un oggetto B e vediamo che ora il reference count é posto a tre. Con una chiamata a reset() sleghiamo temp dalla risorsa sottostante; cambiamo il valore associato ad a e vediamo che questo cambiamento si riflette in b.
Uno degli usi di shared_ptr é in combinazione dei container STL. Il bello é che anche il polimorfismo viene gestito correttamente, come vediamo in quest'altro esempio:
#include <iostream>
#include <vector>
#include <boost/shared_ptr.hpp>
using namespace std;
using namespace boost;
class A {
public:
virtual void sing() = 0;
protected:
virtual ~A() {
};
};
class B : public A {
public:
virtual void sing() {
cout << "Do re mi fa so la" << endl;
}
};
shared_ptr<A> createA() {
shared_ptr<A> p(new B());
return p;
}
int main() {
typedef vector<shared_ptr<A> > containerType;
typedef containerType::iterator iterator;
containerType container;
for (int i = 0; i < 10; ++i) {
container.push_back(createA());
}
cout << "The choir is gathered:" << endl;
iterator end = container.end();
for (iterator it = container.begin(); it != end; ++it) {
(*it)->sing();
}
}
Nessun commento:
Posta un commento