[C++] Как хранить объекты с константными полями в std::vector?

Realist

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

psihodog

Если хочешь ООП-шный подход, то можно только 4: кто его знает, какой ты объект захочешь пихнуть в массив: может сильно разъевшегося потомка.
Если делать по С++-ному, то я бы создал оператор присваивания, в котором просто копировал бы память. Но вообще говоря, это надо сначала хорошо посмотреть, что там у тебя в классе находится, и можно ли с этим так грубо поступать.

Realist

up

zzzzzzzzzzz

А что «ап»? По стандарту std::vector операции присваивания от класса-параметра не требует. Смени реализацию STL.

ppplva

Конечно, требует.
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.

zzzzzzzzzzz

Точно, my bad. Забыл, что это ограничение всех стандартных контейнеров, а проверить ломало
Кстати, а на кой оно ему черт?

borbor

> Суть проблемы в том, что для элементов вектора должен быть определен оператор присваивания,
> а присваивание константному полю недопустимо.
> 1) Отказатсья от константных полей. -- Нарушает логику этих полей
Логика должна быть не у полей, а у состояния объекта.
В твоём случае использование константных полей нарушает логику изменения состояния.

ppplva

Скорее std::vector накладывает неестественные ограничения на объект.
Я бы сделал 2 имхо это никакой не хак, а вполне нормальное решение.

zzzzzzzzzzz

Лучше обернуть std::vector классом, который будет оперировать обертками класса-параметра, реализующими присваивание через д-тор + к-тор копирования. Будет более гибкая реализация vector-а на будущее

Realist

Это небезопасно, если конструтор копирования может генерировать исключения

zzzzzzzzzzz

Сделай параметр-политику, для особо замороченных классов (нет =, к-тор копий кидается) пусть резервная копия вектора делается
Оставить комментарий
Имя или ник:
Комментарий: