У меня есть класс MyClass, содержащий некоторые данные, хранящиеся в std::map
s. Стандартные карты содержат указатели на объекты, например.Expose Member Data Through Iterator только для чтения
private:
std::map<int,Object*> m_data;
Я хочу выставить данные во внешний мир, но я не хочу, чтобы другие классы/функции, чтобы иметь возможность изменять либо (I) карту m_data
или (б) объекты, на который указывает значения в m_data
. Мне нужна какая-то гипотетическая функция, скажем getDataBegin()
, которая возвращает итератор по данным, имеющим свойства выше. Например, я хочу следующие псевдо-код примеров на провал:
iterator_type itr = myclass.getDataBegin();
erase(itr); // not allowed because we cannot modify m_data;
itr.second = NULL; // not allowed to change content of m_data (falls under first rule)
itr.second->methodWithSideEffect(); // not allowed because changes content of object pointed to.
Короче говоря, можно сказать, я после того, как доступ только для чтения к некоторым данным членов. Это вообще возможно в хорошем смысле, и если да, то как я могу это сделать?
Нет бесплатной функции 'erase()', так как пока вы не выставляете ссылки на неконстантные ссылки на ваш контейнер, вам не о чем беспокоиться. Если вы создадите сопоставленный тип 'const Object *', то никто не сможет изменить и указателей. Если изменение отображаемого типа не является вариантом, возможно, что-то можно сделать с помощью 'transform_iterator', который будет содержать указатели. –
Проблема в моей таблице 'MyClass' Мне нужна карта' not 'map ' и компиляторы (g ++/icc) не кажутся счастливыми в том, что они касты между ними. –
Dan
Как насчет 'map', хотя? –