2017-10-14 69 views
0

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

我们得到了2迭代类,常量性迭代器。他们都是List类的子类。迭代器从const_iterator继承。在迭代器的构造函数中,我不确定为什么它是这样写的;

迭代器类:

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

的常量性类:

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

我的问题是,为什么迭代器常量性继承和为什么迭代器的构造函数初始化的const_iterator构造函数和无为本身。

方的问题;当从迭代器访问curr_时,我会如何引用它?我只是打电话curr_或我会使用this-> curr_?

+1

这不是标准库的代码。为了理解它,我们需要看到更多关于你所要求的任何实现。 –

+0

无论如何,'iterator'中的default-ctor看起来破损。 – Deduplicator

+1

你可以看看https://stackoverflow.com/questions/2844466/can-iterator-type-just-subclass-const-iterator,可以帮助您了解从常量性继承的理由。我个人不喜欢这样做,因为IMO公共继承应该用来传达一个'公共的'信息(即模型是一个 - 将会多态使用的对象的关系),这里不是这种情况。 –

回答

2

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

要求标准容器iterator可转换为const_iterator。从另一个中获得一个是实现这一目标的一种方式。

const_iterator基类存储一个指向Nodeiterator不,所以传递参数到基类将初始化curr_构件,这两个基类和派生可以使用。

当从迭代器访问curr_时,我将如何引用它?我只是打电话curr_或我会使用this-> curr_?

只要没有关于它是否是成员变量的问题,您可以在基类和派生中使用curr_。名称以下划线结尾的事实是成员变量名称的通用惯例。

如果对他的范围有任何疑问,您可以使用this->member使其明显,你指的是类的成员。

使用this->时真的不需要它被视为额外混乱的一些人(比如我),所以也许应该保存情况下,有一个真正需要消除歧义的名称。