PDA

View Full Version : [C++] [Boost] Scoped pointers e costruttori


Albi89
23-05-2008, 22:16
Ciao a tutti!
Ho un problema prettamente stilistico per quanto riguarda gli scoped pointers delle librerie Boost.
Mettiamo il caso voglia allocare dinamicamente un oggetto e passare un parametro al suo costruttore.
Faccio in questo modo:

Class* objectptr = new Class(arg1, arg2);
boost::scoped_ptr<Class> object_sptr(objectptr);

E' l'unico modo?
Ho dato un occhio alla documentazione ma non ho trovato niente che facesse al mio caso.
Grazie e ciao ;)

71104
23-05-2008, 22:50
ovviamente puoi fare anche così:

boost::scoped_ptr<Class> object_sptr(new Class(arg1, arg2));

ma in ogni caso ricordati sempre di controllare che l'operatore new non ti abbia restituito NULL, cosa che può succedere se sei a corto di memoria.

non conosco le Boost perché non ho mai avuto occasione di usarle, ne' saprei dove trovare la documentazione di questo scoped pointer; il codice che ho scritto è solo una naturale semplificazione del tuo codice :p

Albi89
23-05-2008, 23:46
ovviamente puoi fare anche così:

boost::scoped_ptr<Class> object_sptr(new Class(arg1, arg2));

ma in ogni caso ricordati sempre di controllare che l'operatore new non ti abbia restituito NULL, cosa che può succedere se sei a corto di memoria.

non conosco le Boost perché non ho mai avuto occasione di usarle, ne' saprei dove trovare la documentazione di questo scoped pointer; il codice che ho scritto è solo una naturale semplificazione del tuo codice :p


Ovviamente anche io la prima volta che mi sono trovato davanti uno scoped pointer ho fatto così, il problema è che... non funziona :sofico:
A quanto ho visto permette la sintassi "abbreviata" permette di richiamare solo il costruttore a zero argomenti, e QUI (http://www.boost.org/doc/libs/1_35_0/libs/smart_ptr/scoped_ptr.htm) non ho trovato niente che facesse al caso mio... possibile che non sia prevista una sintassi "concisa" come quella che mi hai proposto? (che è la sintassi naturale con cui mi sarei aspettato di poterlo utilizzare).

71104
24-05-2008, 00:17
se funziona come hai scritto tu mi pare che debba per forza funzionare anche come ho scritto io... altrimenti prova così:

boost::scoped_ptr<Class> object_sptr = new Class(arg1, arg2);

ma questo credo proprio che non dovrebbe compilare visto che il costruttore è dichiarato explicit.

Albi89
24-05-2008, 01:16
se funziona come hai scritto tu mi pare che debba per forza funzionare anche come ho scritto io... altrimenti prova così:

boost::scoped_ptr<Class> object_sptr = new Class(arg1, arg2);

ma questo credo proprio che non dovrebbe compilare visto che il costruttore è dichiarato explicit.

Ok ho preso un granchio grande quanto una casa, ho riscritto una classe semplice semplice e mi ha accettato tranquillamente
boost::scoped_ptr<Class> object_sptr(new Class(arg1, arg2));

Ovviamente l'assegnazione con l'uguale (che sarebbe stata comoda) non è permessa, ma è sufficiente rilasciare il puntatore e ridichiararlo.

Ora devo solo capire perchè nel programma in cui lo stavo usando non voleva funzionare :D
Thank you per l'aiuto (a quest'ora di sera non pensavo di trovarne) :O

marco.r
24-05-2008, 11:35
ovviamente puoi fare anche così:

boost::scoped_ptr<Class> object_sptr(new Class(arg1, arg2));

ma in ogni caso ricordati sempre di controllare che l'operatore new non ti abbia restituito NULL, cosa che può succedere se sei a corto di memoria.

A meno che uno non voglia farsi del male usando std::nothrow dovrebbe venire gettata un'eccezione, non ritornato 0.