【问题标题】:C++, having issues using const_iterator to make operator=C++,使用 const_iterator 制作 operator= 时遇到问题
【发布时间】:2016-03-12 15:29:34
【问题描述】:

当我编写以下代码时出现编译错误:

const_iterator it = cp.begin();

const_iterator 是我自己的 const iterator 类。
cp 是 ConjuntoPreguntas 类的对象(见下文)。
错误是:

mainprueba.cpp:30:6: error: no match for ‘operator=’ (operand types are ‘ConjuntoPreguntas::const_iterator’ and ‘ConjuntoPreguntas::iterator’)
  cit = CP.begin();
      ^
mainprueba.cpp:30:6: note: candidate is:
In file included from mainprueba.cpp:2:0:
conjuntopreguntas.h:258:21: note: ConjuntoPreguntas::const_iterator& ConjuntoPreguntas::const_iterator::operator=(const ConjuntoPreguntas::const_iterator&)
     const_iterator& operator=(const const_iterator& cit){
                     ^
conjuntopreguntas.h:258:21: note:   no known conversion for argument 1 from ‘ConjuntoPreguntas::iterator’ to ‘const ConjuntoPreguntas::const_iterator&’

代码:

class ConjuntoPreguntas{
private:
    map<int,Pregunta> preguntas;

public:     
    class const_iterator;

    class iterator{
    private:
          map<int,Pregunta>::iterator it;

    public:
          iterator & operator++(){
           ++it;
          }

          iterator & operator--(){
           --it;
          }

          pair<const int,Pregunta> &operator *(){
           return *it;
          }

          bool operator ==(const iterator &i){
           return i.it==it;
          }   

          bool operator !=(const iterator &i){
           return i.it!=it;
          }

          friend class ConjuntoPreguntas;
          friend class const_iterator;
    };


    class const_iterator{
    private:
          map<int,Pregunta>::iterator it;
    public:
          const_iterator(){ 
          }

          const_iterator & operator++(){
           ++it;
          }

          const_iterator & operator--(){
           --it;
          }

          pair<const int,Pregunta> &operator *(){
           return *it;
          }

          bool operator ==(const const_iterator &i){
           return i.it==it;
          }   

          bool operator !=(const const_iterator &i){
           return i.it!=it;
          }

          const_iterator& operator=(const const_iterator& cit){
          }

          friend class ConjuntoPreguntas;

    };

    iterator begin(){
        iterator i;
        i.it=preguntas.begin();
        return i;
    }   

    iterator end(){
        iterator i;
        i.it=preguntas.end();
        return i;
    }
/* other code, irrelevant to the problem */                             
};   

如果有人可以帮助我,我将非常感激。

【问题讨论】:

  • 对开始的调用返回一个迭代器(不是 const_iterator)。您的代码中没有定义从迭代器到 const_iterator 的转换。
  • 这么多朋友……我认为迭代器类可以被继承。

标签: c++ const-iterator


【解决方案1】:

您最直接的问题是因为您没有begin 的const 版本:

   const_iterator begin() const
   {
        const_iterator i;
        i.it = preguntas.begin();
        return i;
    }

但是你的 const_iterator 类也使用了 map 的迭代器,这将导致另一个问题。

如果您正在编写一个看起来像容器的类,那么除了编写 const 正确的迭代器和 const_iterator 类并提供 const 正确的成员之外别无他法。

但是,如果您不编写容器,则可能不想这样做。最好的情况是为类提供与容器无关的接口,例如,您提供有意义的名称而不是直接容器访问。或者通过映射 const_iterator 提供仅 const 访问(不要编写自己的迭代器类)。

【讨论】:

    【解决方案2】:

    如果您想将 std 容器完全封装在您的类中(令人生畏且通常是不必要的任务),您需要确保您还定义了所有转换。特别是,标准容器迭代器有一个构造函数,它从迭代器创建 const_iterator (但不是相反!)。您也必须自己创建它。

    但是,更好的设计选择是简单地公开成员 map 变量。

    【讨论】:

    • 你说的暴露是什么意思?
    • 公开您的preguntas。
    • 违反了封装原则。我的想法:const_iterator 可以按值访问,iterator 可以通过引用访问preguntas。
    • @John_West,只不过是打开迭代器访问它。通过迭代器提供完全访问权限或仅公开变量之间没有区别(从封装的角度来看)。
    • 但是当暴露变量const_iterator(更重要的是,未来开发的所有其他类)也将具有完全访问权限。 iterator 可以是朋友类,而所有其他类只能通过值访问。你怎么看?
    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2014-12-03
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多