Boost scoped_ptr

Da Beyond the C++ Standard Library: An Introduction to Boost, di Björn Karlsson.

scoped_ptr

Lo smart pointer scoped_ptr ricorda da vicino auto_ptr. La differenza sostanziale tra questi due tipi é che non é possibile copiare o assegnare uno scoped_ptr.

É utile usare scoped_ptr quando si prevede che non ci sia un passaggio di proprietà per il puntatore di riferimento.

Ecco un esempio che tocca le funzionalità offerte da scoped_ptr

#include <string>
#include <iostream>
#include "boost/scoped_ptr.hpp"

using namespace std;
using namespace boost;

void checkSize(scoped_ptr<string>& p) {
if (p)
cout << *p << " size is " << p->size() << endl;
else
cout << "p is NULL" << endl;
}

int main() {
scoped_ptr p(new string("Hello"));
checkSize(p);

*p = "Just like a pointer";
checkSize(p);
cout << "p is still " << *p << endl;

p.reset(0);
checkSize(p);

string* raw = p.get();
if(raw == 0)
cout << "raw is a null pointer" << endl;

scoped_ptr<string> q(new string("Bye"));
p.swap(q);
cout << "p after swapping is " << *p << endl;
}

La funzione checkSize() accetta come parametro un riferimento a scoped_ptr. Nota che un oggetto di questo tipo non può essere passato per valore, dato che non é possibile farne una copia.

All'interno della funzione viene usato l'operatore ->, per chiamare la funzione size() del tipo sotteso allo smart pointer (string). Viene inoltre verificato il test contro NULL per il puntatore interno allo smart pointer, utilizzato come argomento dell'if.

Nel main() viene creato un oggetto scoped_ptr passandogli un puntatore a string costruito al volo.

Vediamo che usando l'operatore * in associazione con l'operatore assegnamento si ottiene di resettare il puntatore associato, nello stesso modo in cui si opererebbe con un puntatore grezzo. Si ottiene lo stesso effetto, come vediamo più sotto, utilizzando la funzione membro reset().

La funzione get() ritorna il puntatore grezzo. É una funzione che va utilizzata con prudenza, dato che occorre tenere bene in mente che la proprietà dell'oggetto resta comunque allo smart pointer.

Con swap() é possibile scambiare il contenuto di due scoped_ptr.

Nessun commento:

Posta un commento