Предоставление данных членов через итератор только для чтения - PullRequest
4 голосов
/ 30 сентября 2011

У меня есть класс 'MyClass', который содержит некоторые данные, хранящиеся в std::map s. Стандартные карты содержат указатели на объекты, например

private:
   std::map<int,Object*> m_data;

Я хочу предоставить данные внешнему миру, но я не хочу, чтобы другие классы / функции могли изменять либо (i) карту m_data, либо (ii) объекты, на которые указывают значения в 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.

Короче говоря, вы можете сказать, что я имею доступ только для чтения к некоторым данным участника. Это вообще возможно хорошим способом, и если так, то как я мог пойти об этом?

Ответы [ 2 ]

2 голосов
/ 30 сентября 2011

Попробуйте выставить буст transform_iterator, обернутый вокруг const_iterator карты.Функция преобразования должна выглядеть примерно так:

[](const pair<int, object*>& x) 
{
    return make_pair(x.first, const_cast<const object*>(x.second));
}
0 голосов
/ 30 сентября 2011

возвращает const_iterator, const_iterator разрешает доступ только для чтения.

std::map<int,Object*>::const_iterator const getDataBegin();
...