www.digitalmars.com Home | Search | C & C++ | D | DMDScript | News Groups | index | prev | next
Archives

D Programming
D
D.gnu
digitalmars.D
digitalmars.D.bugs
digitalmars.D.dtl
digitalmars.D.dwt
digitalmars.D.announce
digitalmars.D.learn
digitalmars.D.debugger

C/C++ Programming
c++
c++.announce
c++.atl
c++.beta
c++.chat
c++.command-line
c++.dos
c++.dos.16-bits
c++.dos.32-bits
c++.idde
c++.mfc
c++.rtl
c++.stl
c++.stl.hp
c++.stl.port
c++.stl.sgi
c++.stlsoft
c++.windows
c++.windows.16-bits
c++.windows.32-bits
c++.wxwindows

digitalmars.empire
digitalmars.DMDScript
electronics



c++ - STL standard containers accessors

Hi,
Sorry for not posting this in c++.stl but it does not seem to work for me.

I need to implement the Iterator design pattern. I wrote a ListCollection
class:

template <class Item>
class ListCollection : public Collection<Item>
{
 vector<Item> m_items;

public:

 // Collection implementation
 virtual void add(const Item& pItem) { m_items.push_back(pItem); }
 virtual void remove(const Item&) { }
 virtual size_t count() const { return m_items.size(); }
 virtual Item& get(size_t index) const { return m_items[index]; }
 virtual Iterator<Item>* create_iterator() { return new
ListIterator<Item>(this); }
};

The problem is with the const'ness of Item& get(size_t index) method.
Being constant, the method will call the const version of the std::vector
operator[]  which returns a const reference.
Hence, I receive a compilation error because it cannot convert the return
value from the const to non-const.

My Collection::get() method I found logic to be const but it seems it can't
be due to the implementation of the std::vector::operator[].

Looking to the std::vector class:

 const_reference operator[](size_type _Pos) const
  { // subscript nonmutable sequence
  return (*(begin() + _Pos));
  }

 reference operator[](size_type _Pos)
  { // subscript mutable sequence
  return (*(begin() + _Pos));
  }

Now, the question is why the 2nd version it's not const also ? Afterall, it
doesn't modify the vector. It's exactly as the first version.
I see that using the constant version of the std vector operator[] forces
the return value to be const also. But, as I see in my Collection class,
there are cases when you need to access the operator[] as const but without
returning the const element.
The const'ness of the operator[] should indicate that the operation does not
modify the container not necessary that the container itself is constant.

For my Collection class, I guess one way to still keep the const'ness of the
get() method  (and return a const Item&) is to have a set(const Item&,
size_t index) method. But i don't think it's nice.
My idea is that a Collection class is an encapsulation of as it's name says,
a collection of items. Modifying the elements should be allowed, i guess.

Maybe I am not getting it right. Please give some advices.

thanks.
Oct 10 2007