Возможно ли использовать std :: map в C ++ с классом без оператора копирования? - PullRequest
12 голосов
/ 03 июня 2011

Я использую класс (объект), у которого нет оператора копирования: его сейчас невозможно скопировать.У меня есть переменная

std::map<int,Object> objects

, которая перечисляет объекты с идентификатором int.Как я могу добавить объект на эту карту без использования операторов копирования?Я попытался

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

, но это не скомпилируется.Я просто хотел бы сначала создать свой объект внутри карты, используя конструктор по умолчанию, но запись

objects[0]; не удалась ...

Ответы [ 3 ]

11 голосов
/ 03 июня 2011

В C ++ 03 объекты, которые хранятся в контейнерах STL , должны быть копируемыми. Это связано с тем, что std::allocator контейнера STL фактически использует версию размещения оператора new для копирования конструкции объектов в предварительно выделенных блоках памяти, а для этого требуется наличие конструктора копирования для копирования фактического экземпляра объекта Вы хотите добавить в контейнер адрес памяти, который был предварительно выделен распределителем контейнера. Поэтому ваш единственный вариант - хранить указатели на ваши объекты, а не на сами объекты. Поэтому вы можете сделать следующее:

std::map<int, std::shared_ptr<Object> > objects;
objects.insert(std::pair<int, std::shared_ptr<Object> >(0, new Object());
6 голосов
/ 03 июня 2011

Нет в C ++ 03.Как вы собираетесь получить объект, где бы он сейчас ни находился, на карте без конструктора копирования?

В C ++ 0x вы могли бы перейти на карту и, теоретически, без промедления создать его вместо из других аргументов.

Редактировать: Вы могли бы поменять его, если он может быть заменен, и , вы можете по умолчанию построить его на месте, используя operator[].

std::map<int, Object> objmap;
objmap[2]; // Default-constructs an Object in-place
std::swap(objmap[2], Object()); // Swaps it into the map.
4 голосов
/ 03 июня 2011

Поскольку ваш объект не подлежит копированию, вы можете создать свою карту, содержащую shared_ptr:

std::map<int,shared_ptr< Object > >

, которая заботится об уничтожении объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...