2016-10-26 3 views
-4

[]演算子をオーバーロードしようとしています。私は未処理の例外エラーが発生しています。私はvector<double>を使って行列クラスを実装しています。オペレータスタックオーバーフローのC++オーバーロード

double& Matrix::operator[](int i) 
{ 
    return (*this)[i]; 
} 
+13

[ラバーダック](https://en.wikipedia.org/wiki/Rubber_duck_debugging)には、これがどうなるのか説明してください: '(* this)[i]' – juanchopanza

+0

再帰のように見えます。 – Archie

+0

行列に複数の次元を持たせるべきですか? –

答えて

2

(*this)あなたMatrixオブジェクトを返します。したがって、(*this)[i]Matrix::operator[](i)となります。あなたの関数は次のように、任意の終了条件なしで自分自身を呼んでいる:かなり迅速にクラッシュしてしまいますあなたが想像できるように、

int foo() { 
    return foo(); 
} 

メンバ変数からstd::vector::operator[]を呼び出すことをお勧めします。 、

double& Matrix::operator[](int i) 
{ 
    return this->vec[i]; 
} 

また、this->memberは速記が(*this).memberのために、より頻繁にそれを使用する:あなたのクラスは、vecと呼ばれる民間のベクトルオブジェクトを持っている場合たとえば、あなたがやりたいかもしれません!

1

(*this)[i]は、(*this).operator[](i)と機能的に同等です。

したがって、Matrix::operator[](i)を呼び出します。これは演算子関数自体の中で起こるので、関数は無条件に自身を再帰的に呼び出します。これは、メモリが使い果たされるまで、それ自体を呼び出すことを意味します。メモリが使い果たされると、システムによってはシステム例外が発生します。

Matrixはタイプstd::vector<double>のメンバーを持っていると仮定すると、あなたはおそらく、むしろ(*this)[i]よりも(ベクトルのoperator[]を呼び出す)that_member[i]を使用する必要があります。

関連する問題