Предоставить доступ к инкапсулированному контейнеру

class X {
  public:
    typedef std::list<int> Container;

    // (1)
    const Container& GetElements() const;

    // (2)
    Container::iterator ElementBegin();
    Container::iterator ElementEnd();

    // (3)
    CustomIterator GetElementIterator();

  private:
    Container m_container;
};

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

  1. Предоставляет size (), begin () и end (), все идеально для доступа для чтения. Однако, поскольку возвращенная ссылка на контейнер является константой, вы сможете использовать только const_iterator . Возвращать неконстантную ссылку - это плохо, потому что сам контейнер может быть изменен (например, clear () ).
  2. Предоставляет неконстантный доступ к элементам, однако нам часто нужен собственный size () (например, GetElementCount () ). iterator :: distance () можно использовать, но это может быть неэффективно для некоторых контейнеров (где оператор ++ / - вызывается повторно для вычисления расстояния) .
  3. Предоставляет собственный итератор с такими методами, как next () и т. Д. По-прежнему требуется собственный метод size () .

Я уверен, что есть более хорошие решения, так что если вы знаете, я буду рад их видеть.

5
задан stschindler 26 July 2011 в 07:28
поделиться