我正在努力学习C++,请原谅我,如果这个问题表明缺乏基础知识,你看,事实是,我缺乏基础知识.
我想要一些帮助来解决如何为我创建的类创建迭代器.
我有一个'Shape'类,它有一个容器点.我有一个类'Piece'引用一个Shape并定义Shape的位置.Piece没有Shape它只是引用一个Shape.
我希望它看起来像是一个Points的容器,它与它引用的Shape相同,但是添加了Piece的位置的偏移量.
我希望能够遍历Piece的点,就像Piece本身就是一个容器一样.我已经做了一点阅读,但没有找到任何帮助我的东西.我会非常感谢任何指针.
/编辑:我明白了,这里实际需要一个自己的迭代器(我先读错了这个问题).尽管如此,我仍然让下面的代码成立,因为它在类似情况下很有用.
这里有一个自己的迭代器吗?也许将所有必需的定义转发到容纳实际点的容器就足够了:
// Your class `Piece` class Piece { private: Shape m_shape; public: typedef std::vector::iterator iterator; typedef std::vector ::const_iterator const_iterator; iterator begin() { return m_shape.container.begin(); } const_iterator begin() const { return m_shape.container.begin(); } iterator end() { return m_shape.container.end(); } const_iterator end() const { return m_shape.const_container.end(); } }
这假设你在vector
内部使用,但类型可以很容易地适应.
你应该使用Boost.Iterators.它包含许多模板和概念,用于为现有迭代器实现新的迭代器和适配器.我写了一篇关于这个话题的文章 ; 它出现在2008年12月的ACCU杂志上.它讨论了一个(IMO)优雅的解决方案,用于解决您的问题:使用Boost.Iterators从对象公开成员集合.
如果你只想使用stl,Josuttis书中有一章介绍如何实现自己的STL迭代器.
在这里设计一个像Custom Container这样的STL是一篇很好的文章,它解释了如何设计类似容器类的STL以及它的迭代器类的一些基本概念.反向迭代器(稍微强硬一点)虽然留作练习:-)
HTH,
你可以阅读这篇ddj文章
基本上,继承自std :: iterator以完成大部分工作.