public: typedef other_class :: const_iterator my_class :: const_iterator - приемлемо? - PullRequest
2 голосов
/ 08 сентября 2011

Я ищу способ использовать std :: set :: const_iterator в качестве const_iterator моего собственного класса.

Мой код (который на самом деле ведет себя корректно и прекрасно компилируется) выглядит так:

class MyClass{

public:
    typedef std::set<T>::const_iterator const_iterator;

const_iterator begin() const {
    return mySet->begin();
}

const_iterator end() const {
    return mySet->end();
}

}; // MyClass

Итак, мой вопрос: допустим ли мой способ использования const_iterator в форме, предназначенной для STL?

Редактировать : Смежные вопросы и ответы на Как определить итератор вложенного контейнера?

Ответы [ 4 ]

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

Идея наличия внутреннего типа заключается в том, что общий код может использовать ваш класс без предварительного знания реализации. Суть в том, что существует const_iterator и что он имеет семантику постоянного итератора. Тот факт, что вы заимствуете итератор из внутреннего типа, - это просто деталь реализации, о которой не должен заботиться вызывающий код.

То есть проблема не в том, чтобы определить внутренний тип const_iterator, так как это увеличит связь в пользовательском коде, где им придется явно использовать std::set<T>::const_iterator, что, в свою очередь, делает тип части-члена интерфейса (т. е. вы больше не можете изменять реализацию элемента, не нарушая пользовательский код).

1 голос
/ 08 сентября 2011

Да, конечно. Вы можете хранить std::set<T>::const_iterator где угодно, и создание псевдонима типа еще лучше.

1 голос
/ 08 сентября 2011

Это не особо инкапсулированный, но совершенно правильный метод.

1 голос
/ 08 сентября 2011

Посмотрите на другие адаптеры контейнеров стандартной библиотеки C ++, например std::queue.std::queue - это просто адаптер поверх основного контейнера (по умолчанию std::deque).

Именно этот метод используется в этих адаптерах.Учитывая это, я бы сказал, что ваша реализация в порядке.

...