2017-10-10 7 views
2

J'ai une classeComment créer un vecteur avec des objets non copiables et non mobiles?

class A { 
public: 
    A(int x): x_(x) {} 
    void SetValue(int m) {x_=m}; 
private: 
    DISALLOW_COPY_AND_ASSIGN(A); 
}; 

Je suis en train de créer un vecteur d'objets de type A

vector<std::unique_ptr<A>> objects; 
objects.reserve(10); 
for (int i = 0; i < 10; i++) { 
    auto a = MakeUnique<A>(); 
    a->SetValue(20); 
    objects.emplace_back(a); 
} 

Il en résulte un appel d'erreur de compilation au constructeur supprimé de 'std::unique_ptr<A, std::default_delete<A> >'

+0

'DISALLOW_COPY_AND_ASSIGN (A)' ne devrait pas être une macro qui définit l'opérateur copy ctor et assign, ce devrait être une classe de base qui marque la copie et assigner l'opérateur comme supprimé, et les opérations de déplacement par défaut. –

+0

@GuillaumeRacicot, alors que je conduis toujours à partir de boost non invisibles, je ne vois pas l'avantage de votre assertion/axiome au dessus de la macro –

Répondre

6

std::unique_ptr n'est pas copiable, vous devez donc le déplacer dans le conteneur:

for (int i = 0; i < 10; i++) { 
    auto a = MakeUnique<A>(); 
    a->SetValue(20); 
    objects.emplace_back(std::move(a)); 
} 
+0

Alternative possible avec C++ 17: 'auto & a = objects.emplace_back (MakeUnique ()); a-> SetValue (20); ' – Xirema

+0

' objects.emplace_back (MakeUnique ()); objects.back() -> SetValue (20); ' – rustyx

+0

@Xirema Bien qu'équivalent dans ce cas, il aurait en général un comportement différent dans les cas où' SetValue' peut déclencher une exception. Je préfère généralement mettre en place complètement les objets avant de les remettre à un contaier. – Angew