【问题标题】:C++ error: Passing 'const' as 'this' arrayC++ 错误:将“const”作为“this”数组传递
【发布时间】:2015-11-04 17:06:12
【问题描述】:

Dev C++ 下编译时,我得到passing 'const Array' as 'this' argument of 'int& Array::operator[](int)' discards qualifiers。如果我在cygwin 上使用gcc 进行编译,我会收到一些此类错误消息:

 error: extra qualification ‘Array::’ on member ‘Array’ [-fpermissive]

你能告诉我错误的原因是什么吗?我在这段代码上花了很多时间,但仍然无法使其正常工作。

#include<iostream>
using namespace std;
class Array
{
      int *m_ptr;
      int m_size;
      public:
             Array(int sz)
             {
                       cout<<"constructor\n";
                       m_size = sz;
                       m_ptr = new int[sz];
             }
             ~Array()
             {
                     cout<<"Delete\n";
                     delete[] m_ptr;
             }
             int& operator[] (int j)
             {
                  cout<<"Operation []\n";
                  return m_ptr[j];
             }
             void Array::copy(const Array& ar)
             {
                  m_size = ar.m_size;
                  m_ptr = new int[m_size];
                  int *ptr = ar.m_ptr;
                  int j;
                  for(j = 0;j < m_size; j++)
                  m_ptr[j] = ptr[j];
             }
             Array::Array(const Array& ar)
             {
                                copy(ar);
             }

             void Array::print(const Array& ar)
             {
                  int i;
                  int len = ar.m_size;
                  for(i = 0;i < len;i++)
                  cout<<ar[i]<<"  ";
                  cout<<endl;
             }
};
int main()
{
    Array a1(10);
    Array a2(5);
    int i;
    for(i = 0;i < 10;i++)
    {
          a1[i] = 1;
          if(i < 5) a2[i] = 2;
    }
    print(a1);

    return 0;
}

另外,我正在看的书也有这个功能

Array& operator= (const Array& ar) 
{ 
   delete m_ptr; 
   copy(ar); 
   return *this; 
}

我不明白为什么我们需要使用这个功能。

【问题讨论】:

    标签: c++ arrays dynamic-memory-allocation


    【解决方案1】:

    只是改变

    void Array::copy(const Array& ar)
    

    void copy(const Array& ar)
    

    只有出现在类声明之外的函数定义才需要类范围限定符。

    【讨论】:

      【解决方案2】:

      问题 1

      你不需要Array::

      void Array::copy(const Array& ar) { ... }
      

      当函数在类定义中定义时。可以很简单

      void copy(const Array& ar) { ... }
      

      仅当函数在类定义之外定义时,您才需要 Array:: 部分。

      问题 2

      print 中,你有一行:

                    cout<<ar[i]<<"  ";
      

      由于arconst 对象并且operator[]() 函数不是const 成员函数,因此编译器不喜欢它。您应该做的是提供operator[] 函数的两种重载——一种用于const 对象,另一种用于非const 对象。

      int& operator[] (int j)
      {
         return m_ptr[j];
      }
      
      int operator[] (int j) const
      {
         return m_ptr[j];
      }
      

      然后,您可以使用数组运算符访问const 对象的元素以及访问和修改非const 对象的元素。

      【讨论】:

      • 我想说,即使 const int&amp; 作为 const 重载的返回类型。
      • 执行时我得到一个中止(核心转储)。在我正在阅读的书中,他们添加了函数 Array& operator= (const Array& ar) { delete m_ptr;复制(ar);返回*这个;我不明白为什么我们需要使用这个函数。它如何帮助我们在执行结束时不出现 Aborted(Core dumped) 消息?
      • @George,我建议你用固定的代码问另一个问题,而不是试图在 cmets 中得到答案。
      猜你喜欢
      • 2014-06-26
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      相关资源
      最近更新 更多