Можно ли использовать std:: map в С++ с классом без какого-либо оператора копирования?
Я использую класс (объект), у которого нет оператора копирования: его в настоящее время невозможно скопировать прямо сейчас. У меня есть
std::map<int,Object> objects
которая перечисляет объекты с идентификатором int. Как я могу добавить объект на эту карту, не используя операторы копирования?
Я попробовал
objects.insert(std::pair<0,Object()>);
но это не будет компилироваться. Я просто хотел бы создать свой объект изначально на карте с помощью конструктора по умолчанию, но писать
objects[0];
не удается выполнить...
Спасибо:)
Ответы
Ответ 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 > >
Это позаботится об уничтожении объектов.