Ho una classe che crea un oggetto all'interno di un metodo pubblico. L'oggetto è privato e non visibile agli utenti della classe. Questo metodo quindi chiama altri privati metodi all'interno della stessa classe e passare l'oggetto creato come parametro:Passare un puntatore intelligente come argomento all'interno di una classe: scoped_ptr o shared_ptr?
class Foo {
...
};
class A {
private:
typedef scoped_ptr<Foo> FooPtr;
void privateMethod1(FooPtr fooObj);
public:
void showSomethingOnTheScreen() {
FooPtr fooObj(new Foo);
privateMethod1(fooObj);
};
};
Credo che il puntatore intelligente corretto in questo caso sarebbe uno scoped_ptr, però, non posso fare questo perché scoped_ptr rende la non copiabili classe, se usato in questo modo, quindi dovrei fare i metodi come questo:
void privateMethod1(FooPtr& fooObj);
privateMethod1 non memorizza l'oggetto, né mantiene i riferimenti di esso. Recupera solo i dati dalla classe Foo.
Probabilmente il modo corretto sarebbe non utilizzare affatto un puntatore intelligente e allocare l'oggetto nello stack, ma ciò non è possibile perché utilizza una libreria che non consente oggetti nello stack, che devono essere nell'heap .
Dopotutto, sono ancora confuso riguardo al reale utilizzo di scoped_ptr.
Sono curioso della libreria che "non consente oggetti in pila". Gli oggetti sono allocati all'interno della libreria sullo heap con una fabbrica? La libreria diventa proprietaria del puntatore e lo elimina?Quali sono i motivi per cui non è possibile utilizzare gli oggetti allocati nello stack? –