11

私はC ++で行列クラスを書いていて、=や>>や<<などの演算子をオーバーロードしようとしています.

行列クラスの演算子 [][] をオーバーロードできませんでした。M1 のようなクラス行列のオブジェクトがある場合、この方法を使用して各要素に値を与えることができます。

M1[1][2]=5;

また

int X;

X=M1[4][5];
4

8 に答える 8

22

オーバーロードoperator[]して、行列のそれぞれの行または列へのポインターを返すようにします。ポインタは による添字付けをサポート[]しているため、'double-square' 記法によるアクセス[][]が可能です。

operator()2 つの引数でオーバーロードすることもできます。

于 2011-04-12T14:52:16.480 に答える
9

operator[][]C++ にはありません。この種のアクセスを行うにはreturn、ヘルパー オブジェクトを作成してから、そのオブジェクトもオーバーロードする必要があります。operator[]

于 2011-04-12T14:52:17.603 に答える
7

をオーバーロードできoperator[]ます。したがって、行列をそのように使用したい場合は、行列をベクトルの配列として作成する必要があります。

class Matrix
{
...
  Vector & operator[]( int index );
...
};

class Vector
{
...
  double & operator[]( int index );
...
};

ついに:

Matrix m;
...
double value = m[i][j];
...
于 2011-04-12T14:53:40.143 に答える
4

はありません。行/列オブジェクトへの参照を返すように実装でき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; 
于 2011-04-12T14:53:26.740 に答える
3

実際、私は数年前に自分の行列クラスでそれを行いました。この場合、以下のスニペットを含むマトリックス テンプレート クラスを定義しました。

その後、次のように繰り返して割り当てることができました。

          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];
}
于 2014-06-06T20:22:29.487 に答える
0

[][]そのような演算子がないため、そのようにオーバーロードすることはできません。定義済みのもの (プロキシ)[]を返すようにオーバーロードできます。[]最も単純なケースでは、a のようなものdouble*が機能しますが、通常は、もう少し手間がかかりますが、完全なクラスを使用する方が適切です。(たとえば、境界チェックを追加する場所。)

または、オーバーロードすることもできます(x,y)。誰に尋ねるかによって、どちらかの形式が「より良い」ものになります。(実際、これは厳密にはスタイルの問題です。)

于 2011-04-12T15:22:03.973 に答える