1

如果我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];
        }
};
4

1 回答 1

3

问题是您constMyArray. 所以你需要提供一个const版本operator[]

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

请注意,除了非常量版本之外,您还可以提供此版本。

assert顺便说一句,如果索引超出范围,则可能是调用以外的其他方法。例如,您可以抛出异常。这使调用者代码有机会至少恢复并做一些事情。std::out_of_range异常是为这些情况设计的。

于 2012-08-12T08:52:18.710 回答