【问题标题】:Understanding iterator class in c++理解 C++ 中的迭代器类
【发布时间】:2018-03-26 16:34:14
【问题描述】:

最近在课堂上,我们学习了 STL 迭代器来遍历列表。在为链表的基本迭代器给出的示例代码中,我遇到了一些我无法理解的东西。

我们有 2 个迭代器类,const_iterator 和迭代器。它们都是 List 类的子类。迭代器继承自 const_iterator。在迭代器的构造函数中我不知道为什么会这样写;

迭代器类:

class iterator:public const_iterator{ 
    friend sortedList
protected:
    iterator(Node* n):const_iterator(n){}
public:
    iterator(){ 
        n = nullptr;
    }

const_iterator 类:

    class const_iterator { 
    friend SortedList 
protected:
    Node* curr_;
    const_iterator(Node* n){ 
        curr_ = n; 
    }
public:
    const_iterator(){
        curr_ = nullptr;
    }

我的问题是为什么迭代器从 const_iterator 继承,为什么迭代器的构造函数初始化 const_iterator ctor 而对自己什么也不做。

附加问题;从迭代器访问 curr_ 时,我将如何引用它?我会直接调用 curr_ 还是使用 this->curr_?

【问题讨论】:

  • 那不是标准库代码。要理解它,我们需要更多地了解您所询问的任何实现。
  • 不管怎样,iterator 中的 default-ctor 看起来坏了。
  • 您可以查看stackoverflow.com/questions/2844466/…,这可能有助于您理解从 const_iterator 继承的基本原理。我个人不喜欢这种方式,因为应该使用 IMO 公共继承来传达“公共”信息(即为将被多态使用的对象建模 a is-a 关系),而这里的情况并非如此。跨度>

标签: c++ linked-list iterator


【解决方案1】:

我的问题是为什么迭代器从 const_iterator 继承,为什么迭代器的构造函数初始化 const_iterator ctor 而对自己什么也不做。

iterator可转换为const_iterator的标准容器有一个要求。从另一个派生出一个是实现这一点的一种方式。

const_iterator 基类存储指向 Node 的指针,但 iterator 没有,因此将参数传递给基类将初始化基类和派生类都可以使用的 curr_ 成员。

当从迭代器访问 curr_ 时,我将如何引用它?我会直接调用 curr_ 还是使用 this->curr_?

你可以在基类和派生类中都使用curr_,只要它是否是成员变量没有问题。名称以下划线结尾的事实是成员变量名称的常见约定。

如果对他的作用域有任何疑问,您可以使用this->member 来表明您指的是该类的成员。

在真正不需要时使用this-> 会被某些人(比如我)认为是额外的混乱,因此可能应该将其保存在真正需要消除名称歧义的情况下。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-21
    • 2015-08-03
    • 2018-01-05
    • 2019-04-01
    • 2015-09-30
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    相关资源
    最近更新 更多