c++ - Can I use a `unique_ptr` in a vector, or do I need to switch to `shared_ptr`? -


given class unique_ptr:

class myclass { public:   myclass(){}   myclass(myclass &&other) : ptr(std::move(other.ptr)){}    std::unique_ptr <int> ptr; }; 

is there way make possible have std::vector<myclass>?

void thisbreaksit() {   myclass instance;   std::vector<myclass> mv;   mv.push_back(instance); } 

as-is, gives me error

error c2248: 'std::unique_ptr<_ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_ty>' 

this makes sense, since have no copy constrctor, , when compiler tries creating default copy constructor, tries copying unique_ptr, isn't allowed.

i can make compile adding constructor:

  myclass(const myclass&){} 

but of course, leaves unique_ptr uninitialized, , not want.

i can't add

  myclass(const myclass& other) : ptr(std::move(other.ptr)){} 

because it's const, , cant call std::move() on const object. can create constructor

  myclass(myclass& other) : ptr(std::move(other.ptr)){} 

but doesn't solve original compile error, vector::push_back uses const copy constructor.

so, i'm stuck. there way i'm trying do?

all of these issues go away if use shared_ptr instead of unique_ptr. should doing?

there's no problem storing non-copyable type in vector; it's required movable, yours is.

the problem this:

mv.push_back(instance); 

tries insert copy of instance, , class not copyable. movable:

mv.push_back(std::move(instance)); 

note there's no need write own default , move constructors in example. implicit ones yours do.


Comments

Popular posts from this blog

javascript - how to protect a flash video from refresh? -

android - Associate same looper with different threads -

visual studio 2010 - Connect to informix database windows form application -