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

const問題は、のインスタンスで非 const 演算子を呼び出していることですMyArrayconstしたがって、次のバージョンを提供する必要がありますoperator[]

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

非 const バージョンに加えて、このバージョンを提供できることに注意してください。

余談assertですが、インデックスが範囲外の場合は、呼び出し以外の方法を使用することをお勧めします。たとえば、例外をスローできます。これにより、呼び出し元のコードに、少なくとも回復して何かを行う機会が与えられます。std::out_of_range例外は、これらのケースのために設計されています。

于 2012-08-12T08:52:18.710 に答える