Существует проблема зависимости при представлении члена данных внешнему миру.
Если вы решите изменить свой атрибут на что-то лучшее (потому что list
является последним средством контейнера), или потому что у вас естьновые требования, тогда все ваши клиенты будут затронуты, и это плохо.
Одна простая альтернатива - предложить typedef
:
typedef std::list<Foo>::const_iterator const_iterator;
ЕСЛИ ваши клиенты используют ваш псевдоним,тогда это просто вопрос перекомпиляции кода.
Другая альтернатива - создать свой собственный класс итераторов (не так уж сложно), который будет вставлять фактический итератор.
class const_iterator
{
public:
private:
typedef std::list<Foo>::const_iterator base_type;
base_type mBase;
};
Вы просто пересылаете всеоперации с реальным итератором, и ваши клиенты (хотя им придется перекомпилировать, если вы измените свой контейнер) не могут случайно использовать несвязанный тип.
Тогда 3-е решение аналогично первому, за исключением того, что выабстрагируй тип ... хотя это довольно неэффективно (для списка), поэтому я бы не советовал: итераторы должны бытьдешево копировать, вы не хотите new
ничего.