C ++中的抽象迭代器类

时间:2014-01-22 08:58:17

标签: c++ iterator abstract

在编写AVL树类之后,我想为树编写3种迭代器:preOrder,inOrder,postOrder。 我认为一种非常合理的方法是通过抽象类迭代器来实现,因此3个迭代器类就是从它中获得的。但是当我想要写postfix ++运算符的声明时出现问题。 我想到了一些选择: 迭代器和操作者++(INT)    问题:    postfix迭代器无法返回引用该对象。 2.迭代器运算符++(int)    问题:    类迭代器是抽象的,因此不能按值返回。

那么正确的方法是什么? 谢谢

1 个答案:

答案 0 :(得分:8)

后缀增量必须按值返回,并且必须返回与对象相同的类型。它不适合动态多态。

您所做的事情取决于您首先使用基类的原因:

1)您需要多态迭代器,并且您希望用户具有引用基础。这是在C ++中使用迭代器的常规方法,并且它不能正常工作[*]。编写可能接受不同类型迭代器的代码的常规方法是使用迭代器类型作为模板参数编写函数模板。您应该更改设计(以便用户始终知道它们具有哪种迭代器)或者定义一个可以包含三种迭代器中的任何一种的包装类,然后可以具有一个后缀增量返回包装器的实例。从用户的POV中有一个迭代器类型有三种模式(预订,按顺序,后序迭代)。如果你想使用动态多态在内部实现,那那就是你的业务。

2)你想在迭代器之间共享一些代码,基类是一种分享代码的便捷方式。然后不要使postfix在基类中增加一个函数。

[*]为什么某些运算符在C ++中不能很好地处理动态多态?因为C ++使用值语义。像postfix增量,加法和其他按值返回的运算符本身会创建一个新对象。调用代码需要在堆栈上为该新对象(以及它的副本)提供空间,因此需要知道动态类型。其他语言可以解决这个问题,因为对象类型没有存储在堆栈中 - 它们被“分配”到其他地方(堆)。调用代码不需要知道大小或动态类型,因为它只能通过引用访问它们。