gpt4 book ai didi

c++ - C++ 中的抽象迭代器类

转载 作者:太空宇宙 更新时间:2023-11-04 15:04:07 25 4
gpt4 key购买 nike

在编写完 AVL 树类之后,我想为树编写 3 种迭代器:preOrder、inOrder、postOrder。我认为一个非常合理的方法是通过抽象类迭代器来实现,因此 3 个迭代器类继承自它。但是当我想写后缀++ 运算符的声明时出现问题。我考虑了一些选择:1. 迭代器&运算符++(int) 问题: 后缀迭代器无法返回对对象的引用。2. 迭代器运算符++(int) 问题: 类迭代器是抽象的,因此不能按值返回。

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

最佳答案

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

你做什么取决于你首先使用基类的原因:

1) 您需要多态迭代器,并且您希望用户将拥有对基的引用。这不是在 C++ 中使用迭代器的正常方式,而且效果不佳[*]。编写可能接受不同类型迭代器的代码的正常方法是编写一个函数模板,将迭代器类型作为模板参数。您应该更改设计(以便用户始终知道他们拥有哪种迭代器)或定义一个可以容纳三种迭代器中的任何一种的包装类,然后可以有一个后缀增量返回包装器的实例。从用户的 POV 来看,有一种迭代器类型具有三种模式(前序、中序、后序迭代)。如果您想使用动态多态性在内部实现它,那是您的事。

2) 您希望在迭代器之间共享一些代码,基类是共享代码的便捷方式。那就不要让后缀自增成为基类中的一个函数。

[*] 为什么某些运算符不能很好地处理 C++ 中的动态多态性?因为 C++ 使用值语义。像后缀增量、加法和其他按值返回的运算符本质上创建了一个新对象。调用代码需要在堆栈上为该新对象留出空间(好吧,它的一个拷贝),因此它需要知道动态类型。其他语言解决了这个问题,因为对象类型不存储在堆栈中——它们被分配到“其他地方”(堆)。调用代码不需要知道大小或动态类型,因为它仅通过引用访问它们。

关于c++ - C++ 中的抽象迭代器类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21278305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com