如何在复制构造函数中调用重载的下标?

时间:2012-08-12 08:50:14

标签: c++ compiler-errors overloading copy-constructor subscript

如果我从复制构造函数const中删除MyArray(const MyArray& cArrayInput),一切都很顺利。否则,在m_paArray[i] = cArrayInput[i]行发生以下编译错误:

  

错误C2678:二进制'[':找不到带有'const MyArray'类型左手操作数的运算符(或者没有可接受的转换)。

我知道我可以使用cArrayInput.m_paArray[i]。但是如何使用重载的下标函数?

class MyArray
{
private:
    int m_nLength;
    double* m_paArray;
public:
    MyArray():m_nLength(0),m_paArray(0)
    {
    }
    // copy constructor
    MyArray(const MyArray& cArrayInput)
    {
        m_nLength = cArrayInput.m_nLength;
        m_paArray = new double[m_nLength];
        for(int i=0;i<m_nLength;i++)
            m_paArray[i] = cArrayInput[i];
    }
    double& operator[](const int nIndex)
        {
           assert(nIndex >= 0  && nIndex < m_nLength);
           return m_paArray[nIndex];
        }
};

1 个答案:

答案 0 :(得分:3)

问题是您在const MyArray实例上调用非const运算符。因此,您需要提供constoperator[]

const double& operator[](const int nIndex) const
{
  assert(nIndex >= 0  && nIndex < m_nLength);
  return m_paArray[nIndex]; 
}

请注意,您可以将此版本另外提供给非const版本。

顺便说一句,如果索引超出范围,可能会想到除了调用assert之外的其他内容。例如,你可以抛出异常。这为调用者代码提供了至少恢复和执行某些操作的机会。 std::out_of_range例外是针对这些情况而设计的。