Desidero restituire due valori, uno dei quali è un nuovo oggetto. Posso farlo utilizzando std::pair
:Restituzione di un nuovo oggetto con un altro valore
class A {
//...
};
std::pair<A*, int> getA()
{
A* a = new A;
//...
}
Per rendere il codice sicuro rispetto alle eccezioni, vorrei fare:
std::pair<std::auto_ptr<A>, int> getA()
{
std::auto_ptr<A> a(new A);
//...
}
Ma questo non verrà compilato come il auto_ptr
non possono essere copiati senza modificare la auto_ptr
da copiare. Ok, questo significa che auto_ptr
non si compongono bene come altri tipi (in un altro modo). Qual è un buon modo per restituire un nuovo oggetto in questo caso?
Un'alternativa è quella di restituire un shared_ptr
e un altro è un riferimento inout. Ma sto cercando qualche altra alternativa. Posso fare qualcosa come:
class AGetter
{
void getAExecute()
{
//...
// set a_ and i_
}
std::auto_ptr<A> getA() const
{
return a_.release();
}
int getInt() const
{
return i_;
}
private:
std::auto_ptr<A> a_;
int i_;
};
C'è un modo migliore?
shared_ptr è leggermente/banalmente inefficiente e virale. Argomentazioni non molto forti contro shared_ptr, ma ancora un fattore contro di loro (nel 10% dei casi). –
fortunatamente, lo standard successivo contiene unique_ptr, che può essere spostato insieme alla coppia che lo contiene. –