[C++] Как хранить объекты с константными полями в std::vector?
Если делать по С++-ному, то я бы создал оператор присваивания, в котором просто копировал бы память. Но вообще говоря, это надо сначала хорошо посмотреть, что там у тебя в классе находится, и можно ли с этим так грубо поступать.
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.
Кстати, а на кой оно ему черт?
> а присваивание константному полю недопустимо.
> 1) Отказатсья от константных полей. -- Нарушает логику этих полей
Логика должна быть не у полей, а у состояния объекта.
В твоём случае использование константных полей нарушает логику изменения состояния.
Я бы сделал 2 имхо это никакой не хак, а вполне нормальное решение.
Лучше обернуть std::vector классом, который будет оперировать обертками класса-параметра, реализующими присваивание через д-тор + к-тор копирования. Будет более гибкая реализация vector-а на будущее
Это небезопасно, если конструтор копирования может генерировать исключения
Сделай параметр-политику, для особо замороченных классов (нет =, к-тор копий кидается) пусть резервная копия вектора делается
Оставить комментарий
Realist
Суть проблемы в том, что для элементов вектора должен быть определен оператор присваивания, а присваивание константному полю недопустимо.Я знаю следующие решения:
1) Отказатсья от константных полей. -- Нарушает логику этих полей
2) Написать свой оператор присваивания, где используетчся const_cast. -- Смахивает на грязный хак.
3) Написать опретор присваивания как вызовы деструктора и конструктора копирования в том же месте. --- Очень грязный хак.
4) Хранить указатели на объекты. -- Лишнее хождение по ссылкам. Да и ображение к объету через итератор с помощтью двух звездочек напрягает.
5) Не парить мозг и использовать std::list. -- Медленнее вектора
6) Не парить мозг и использовать Си-массивы. -- Стремно
Что делать, кто бы посоветовал?