如果我从复制构造函数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];
}
};
答案 0 :(得分:3)
问题是您在const
MyArray
实例上调用非const运算符。因此,您需要提供const
版operator[]
:
const double& operator[](const int nIndex) const
{
assert(nIndex >= 0 && nIndex < m_nLength);
return m_paArray[nIndex];
}
请注意,您可以将此版本另外提供给非const版本。
顺便说一句,如果索引超出范围,可能会想到除了调用assert
之外的其他内容。例如,你可以抛出异常。这为调用者代码提供了至少恢复和执行某些操作的机会。 std::out_of_range例外是针对这些情况而设计的。