私はC ++で行列クラスを書いていて、=や>>や<<などの演算子をオーバーロードしようとしています.
行列クラスの演算子 [][] をオーバーロードできませんでした。M1 のようなクラス行列のオブジェクトがある場合、この方法を使用して各要素に値を与えることができます。
M1[1][2]=5;
また
int X;
X=M1[4][5];
私はC ++で行列クラスを書いていて、=や>>や<<などの演算子をオーバーロードしようとしています.
行列クラスの演算子 [][] をオーバーロードできませんでした。M1 のようなクラス行列のオブジェクトがある場合、この方法を使用して各要素に値を与えることができます。
M1[1][2]=5;
また
int X;
X=M1[4][5];
オーバーロードoperator[]
して、行列のそれぞれの行または列へのポインターを返すようにします。ポインタは による添字付けをサポート[]
しているため、'double-square' 記法によるアクセス[][]
が可能です。
operator()
2 つの引数でオーバーロードすることもできます。
operator[][]
C++ にはありません。この種のアクセスを行うにはreturn
、ヘルパー オブジェクトを作成してから、そのオブジェクトもオーバーロードする必要があります。operator[]
をオーバーロードできoperator[]
ます。したがって、行列をそのように使用したい場合は、行列をベクトルの配列として作成する必要があります。
class Matrix
{
...
Vector & operator[]( int index );
...
};
と
class Vector
{
...
double & operator[]( int index );
...
};
ついに:
Matrix m;
...
double value = m[i][j];
...
はありません。行/列オブジェクトへの参照を返すように実装できoperator[][]
ます。その中で、セル参照を返すために を実装できます。operator[]
operator[]
次のようなことをして、面倒なことをすべて避けることができます..
struct loc
{
int x;
int y;
};
次に、オーバーロードで、次のようなoperator[]
a を受け入れますloc
T& operator[](loc const& cLoc)
{
// now you have x/y you can return the object there.
}
呼び出すには、次のようにするだけです。
matrix[loc(2,3)] = 5;
実際、私は数年前に自分の行列クラスでそれを行いました。この場合、以下のスニペットを含むマトリックス テンプレート クラスを定義しました。
その後、次のように繰り返して割り当てることができました。
for(size_t k=1; k<n; ++k) {
minor[p][k-1]=major[j][k];
}
これが役立つことを願っています。
// //////////////////////////////////////////////////////////////////////////////
// list is internal vector representation of n x m matrix
T* list;
// Proxy object used to provide the column operator
template < typename T >
class OperatorBracketHelper
{
Matrix < T > & parent ;
size_t firstIndex ;
public :
OperatorBracketHelper ( Matrix < T > & Parent , size_t FirstIndex ) :
parent ( Parent ), firstIndex ( FirstIndex ) {}
// method called for column operator
T & operator []( size_t SecondIndex )
{
// Call the parent GetElement method which will actually retrieve the element
return parent.GetElement ( firstIndex , SecondIndex );
}
};
// method called for row operator
OperatorBracketHelper < T > operator []( size_t FirstIndex )
{
// Return a proxy object that "knows" to which container it has to ask the element
// and which is the first index (specified in this call)
return OperatorBracketHelper < T >(* this , FirstIndex );
}
T & GetElement ( size_t FirstIndex , size_t SecondIndex )
{
return list[FirstIndex*cols+SecondIndex];
}
[][]
そのような演算子がないため、そのようにオーバーロードすることはできません。定義済みのもの (プロキシ)[]
を返すようにオーバーロードできます。[]
最も単純なケースでは、a のようなものdouble*
が機能しますが、通常は、もう少し手間がかかりますが、完全なクラスを使用する方が適切です。(たとえば、境界チェックを追加する場所。)
または、オーバーロードすることもできます(x,y)
。誰に尋ねるかによって、どちらかの形式が「より良い」ものになります。(実際、これは厳密にはスタイルの問題です。)