Diversi modi per aggiungere un elemento in un contenitore di puntatori intelligenti. Mi sto chiedendo in che direzione andrai.Aggiungere un elemento in un contenitore di puntatori intelligenti
class MyContainer
{
private:
std::vector<std::unique_ptr<Item>> mItems;
public:
bool Add(Item* item);
// This is Way 1
//
// Advantages:
// - Easy to add derived items, such as Add(new DerivedItem);
// - No interface change if smart pointer type changes to such as shared_ptr;
//
// Disadvantages:
// - Don't explicitly show the item to add must be allocated on heap;
// - If failed to add, user has to delete the item.
bool Add(std::unique_ptr<Item> item);
// This is Way 2
// Disadvantages and advantages are reversed from Way 1.
// Such as to add derived item, Add(std::unique_ptr<Item>(new DerivedItem));
// |
// easy to write DerivedItem here for an error
bool Add(std::unique_ptr<Item>& item);
// This is Way 3
// Similar to Way 2, but when failed to add, item still exist if it is a
// reference of outer unique_ptr<Item>
};
io personalmente vado per strada 1. Qualsiasi più vantaggi per Way 2 e 3 o svantaggi di Via 1 che dovrei andare per 2 o 3?
sftrabbit fornisce molti buoni punti. Nel seguente caso comune. Come usare Way 2 o 3 per farlo facilmente? L'utente usa una finestra di dialogo per generare un nuovo oggetto derivato. È messo su std::unique_ptr<DerivedItem> item
. Quando fai clic sul pulsante 'OK', viene aggiunto al contenitore. Se non è stato possibile aggiungere, tornare alla finestra di dialogo per una modifica.
+1, in particolare per la ragione 2. – us2012
Consideriamo un caso. L'utente usa una finestra di dialogo per generare un nuovo oggetto derivato. Si trova su 'std :: unique_ptr item'. Quando fai clic sul pulsante 'OK', viene aggiunto al contenitore. Se non è stato possibile aggiungere, tornare alla finestra di dialogo per una modifica. In che modo è più conveniente? Grazie. –
user1899020
@ user1899020 Mi sto attenendo alla mia risposta. È indipendente da cosa stai usando 'MyContainer' per. Ti raccomando di consentire la propagazione di un'eccezione se non puoi aggiungere l'elemento '. Spetta al cliente gestirlo. –