Подтвердить что ты не робот

Можно ли использовать std:: map в С++ с классом без какого-либо оператора копирования?

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

std::map<int,Object> objects

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

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

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

objects[0]; не удается выполнить... Спасибо:)

4b9b3361

Ответ 1

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

std::map<int, std::shared_ptr<Object> > objects;
objects.insert(std::pair<int, std::shared_ptr<Object> >(0, new Object());

Ответ 2

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

В С++ 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.

Ответ 3

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

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

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