【问题标题】:How to implement const iterator?如何实现 const 迭代器?
【发布时间】:2020-10-02 17:57:19
【问题描述】:

在 C++11 中,我在实现 const 迭代器时遇到问题 int 我的课程代码(在 .cpp 文件中)我有:

class MyClass{

public:

    class iterator;

    iterator begin() const;

    iterator end() const;

    class const_iterator;

    const_iterator begin() const;

    const_iterator end() const;
}

但您可能知道,我无法实现具有相同签名的 2 个函数,那么我该如何解决呢?

【问题讨论】:

  • 你为什么要做iterator begin() const;?为什么是const
  • 因为我不应该对我的班级成员进行更改(这个)
  • 通常,您可以使用它进行更改,例如插入、擦除 ....
  • 如果你删除/插入一些数据,指向你数据的指针可能指向一个新的动态数组。
  • 你的类应该有一个 const begin() 和一个非常量 begin()。有两个 const begin() 是没有意义的。如果你不想要一个非常量 begin() 完全删除它。

标签: c++ class methods iterator


【解决方案1】:

即使函数本身不会改变 this 对象,如果你想让 begin() 同时用于 iteratorconst_iterator,是为了使 2 函数在常量上有所不同,所以你应该这样做:

iterator begin();
const_iterator begin() const ;

并让编译器选择最好的(如果this是const,他会选择第二个,否则选择第一个)

这实际上是有道理的......如果你有一个iterator,你必须有一个非const类的实例,否则你可以用一个const集合构建一个iterator,并且所以你可以改变一个 const 集合,这不是你想要的

【讨论】:

  • 但是我的教授说如果一个函数不会做出改变,它应该被声明为 const 否则他会减分
  • 也许泛型在这里会有所帮助?
  • @smith 他是对的,但是在iterator 类中,您可能会从begin 函数中调用一个构造函数,该函数将接受指向您的类的指针之类的东西像那样...该指针将指向一个实例非const,因此如果您将begin函数标记为const,您将无法调用该构造函数
  • @smith generics 属于 java...这是 C++,不,在这种情况下,模板对您没有帮助,或者可能有很多样板文件可以避免取出该 const
  • 这不也算重复代码吗?
猜你喜欢
  • 2011-01-10
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多