[C++] Как хранить объекты с константными полями в std::vector?
Если хочешь ООП-шный подход, то можно только 4: кто его знает, какой ты объект захочешь пихнуть в массив: может сильно разъевшегося потомка.
Если делать по С++-ному, то я бы создал оператор присваивания, в котором просто копировал бы память. Но вообще говоря, это надо сначала хорошо посмотреть, что там у тебя в классе находится, и можно ли с этим так грубо поступать.
Если делать по С++-ному, то я бы создал оператор присваивания, в котором просто копировал бы память. Но вообще говоря, это надо сначала хорошо посмотреть, что там у тебя в классе находится, и можно ли с этим так грубо поступать.
up
А что «ап»? По стандарту std::vector операции присваивания от класса-параметра не требует. Смени реализацию STL.
Конечно, требует.
The type of objects stored in these components must meet the requirements of CopyConstructible
types (20.1.3 and the additional requirements of Assignable types.
Точно, my bad. Забыл, что это ограничение всех стандартных контейнеров, а проверить ломало 
Кстати, а на кой оно ему черт?

Кстати, а на кой оно ему черт?
> Суть проблемы в том, что для элементов вектора должен быть определен оператор присваивания,
> а присваивание константному полю недопустимо.
> 1) Отказатсья от константных полей. -- Нарушает логику этих полей
Логика должна быть не у полей, а у состояния объекта.
В твоём случае использование константных полей нарушает логику изменения состояния.
> а присваивание константному полю недопустимо.
> 1) Отказатсья от константных полей. -- Нарушает логику этих полей
Логика должна быть не у полей, а у состояния объекта.
В твоём случае использование константных полей нарушает логику изменения состояния.
Скорее std::vector накладывает неестественные ограничения на объект.
Я бы сделал 2 имхо это никакой не хак, а вполне нормальное решение.
Я бы сделал 2 имхо это никакой не хак, а вполне нормальное решение.
Лучше обернуть std::vector классом, который будет оперировать обертками класса-параметра, реализующими присваивание через д-тор + к-тор копирования. Будет более гибкая реализация vector-а на будущее 

Это небезопасно, если конструтор копирования может генерировать исключения
Сделай параметр-политику, для особо замороченных классов (нет =, к-тор копий кидается) пусть резервная копия вектора делается 

Оставить комментарий
Realist
Суть проблемы в том, что для элементов вектора должен быть определен оператор присваивания, а присваивание константному полю недопустимо.Я знаю следующие решения:
1) Отказатсья от константных полей. -- Нарушает логику этих полей
2) Написать свой оператор присваивания, где используетчся const_cast. -- Смахивает на грязный хак.
3) Написать опретор присваивания как вызовы деструктора и конструктора копирования в том же месте. --- Очень грязный хак.
4) Хранить указатели на объекты. -- Лишнее хождение по ссылкам. Да и ображение к объету через итератор с помощтью двух звездочек напрягает.
5) Не парить мозг и использовать std::list. -- Медленнее вектора
6) Не парить мозг и использовать Си-массивы. -- Стремно
Что делать, кто бы посоветовал?