Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is is possible to use std::map in C++ with a class without any copy operator?

I'm using a Class (Object) that doesn't have any copy operator : it basically cannot be copied right now. I have a

std::map<int,Object> objects

variable that lists objects with an int identifier. How could I add an Object to this map without having to use copy operators? I tried

objects.insert(std::pair<0,Object()>);

but that won't compile. I would just like to create my object initially inside the map using the default constructor, but writing

objects[0]; fails... Thanks :)

like image 697
Tuxer Avatar asked Jun 03 '11 18:06

Tuxer


1 Answers

In C++03, objects that are stored in STL containers must be copyable. This is because a STL container's std::allocator actually uses the placement version of the new operator to copy construct the objects in pre-allocated memory blocks, and that requires the existence of a copy-constructor to copy the actual instance of the object you're wanting to add to the container into the memory address that had been pre-allocated by the container's allocator. So your only option would be to store pointers to your objects rather than the objects themselves. Therefore, you could do the following:

std::map<int, std::shared_ptr<Object> > objects;
objects.insert(std::pair<int, std::shared_ptr<Object> >(0, new Object());
like image 154
Jason Avatar answered Sep 22 '22 05:09

Jason