Han*_*lil 0 c++ iterator abstract
在编写AVL树类之后,我想为树编写3种迭代器:preOrder,inOrder,postOrder.我认为一种非常合理的方法是通过抽象类迭代器来实现,因此3个迭代器类就是从它中获得的.但是当我想编写postfix ++运算符的声明时出现问题.我想在一些选项中:1.iterator&operator ++(int)问题:postfix迭代器无法返回引用对象.2.迭代器运算符++(int)问题:类迭代器是抽象的,因此不能按值返回.
那么这样做的正确方法是什么?谢谢
Postfix增量必须按值返回,并且必须返回与对象相同的类型.它不适合动态多态.
你做什么取决于你首先使用基类的原因:
1)您需要多态迭代器,并且您希望用户具有引用到基础.这不是在C++中使用迭代器的常规方法,并且它不能很好地工作[*].编写可能接受不同类型迭代器的代码的常规方法是使用迭代器类型作为模板参数编写函数模板.您应该更改设计(以便用户始终知道它们具有哪种迭代器)或定义可以包含三种迭代器中的任何一种的包装类,然后它可以具有返回包装器实例的后缀增量.从用户的POV中有一个迭代器类型有三种模式(预订,按顺序,后序迭代).如果你想使用动态多态在内部实现,那那就是你的业务.
2)您希望在迭代器之间共享一些代码,而基类是共享代码的便捷方式.然后不要使postfix在基类中增加一个函数.
[*]为什么某些运算符在C++中不能很好地处理动态多态?因为C++使用值语义.像postfix增量,加法和其他按值返回的运算符本身会创建一个新对象.调用代码需要在堆栈上为该新对象(以及它的副本)提供空间,因此需要知道动态类型.其他语言可以解决这个问题,因为对象类型没有存储在堆栈中 - 它们被"分配"到其他地方(堆).调用代码不需要知道大小或动态类型,因为它只通过引用访问它们.