1

マトリックスのように動作するクラスのテンプレートがあります。したがって、ユースケースは次のようなものです。

Matrix matrix(10,10);
matrix[0][0]=4;
//set the values for the rest of the matrix
cout<<matrix[1][2]<<endl;

コンストラクターで値を直接設定するとうまくいきますが、使用したい場合matrix[x][y]=z;error: lvalue required as left operand of assignment. =演算子をオーバーロードする必要があると思います。それにもかかわらず、私は一晩中試してみましたが、それを実装する方法がわかりませんでした。誰か親切に=して、コードの演算子をオーバーロードして、その行列に値を割り当てる方法を教えてくれませんか?

コード:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <sstream>

using namespace std;

class Matrix {
public:

    Matrix(int x,int y) {
        _arrayofarrays = new int*[x];
        for (int i = 0; i < x; ++i)
            _arrayofarrays[i] = new int[y];

        // works here
        _arrayofarrays[3][4] = 5;
    }

    class Proxy {
    public:

        Proxy(int* _array) : _array(_array) {
        }

        int operator[](int index) {
            return _array[index];
        }
    private:
        int* _array;
    };

    Proxy operator[](int index) {
        return Proxy(_arrayofarrays[index]);
    }

private:
    int** _arrayofarrays;
};

int main() {
    Matrix matrix(5,5);

    // doesn't work :-S
    // matrix[2][1]=0;

    cout << matrix[3][4] << endl;
}
4

2 に答える 2

4

プロキシによって参照される行列の要素を変更する場合はoperator[]Proxyクラス内のオーバーロードが参照を返す必要があります。

int& operator[](int index)

現時点では、必要intなものではなく、要素の値のコピーを作成する を返します。行列で機能するように、constオーバーロードも必要です。これは値で返すことができます:operator[]const

int operator[](int index) const

実際には、符号なしの型であるsize_tため、 よりもインデックスに適しています。int負のインデックスに特別な意味を与えているわけではないので、それらを許可しないのは理にかなっています。

行全体を一度に割り当てたい場合operator=を除き、オーバーロードする必要はありません。実際、行配列へのポインターを直接返すことができるためProxy、クラスはまったく必要ありません。Proxyただし、スパース表現やパック表現を使用するなど、設計を変更したい場合は、 を使用するとインターフェイスProxyを維持m[i][j]できます。

于 2013-04-01T23:51:42.000 に答える
3

問題は、proxy::operator[] で int 値を返していることです。最初の [] 演算子はプロキシ オブジェクトを返し、2 番目の演算子は int を返します。プロキシ [] 演算子が int 参照を返す場合、それに割り当てることができます。

int& operator[](int index) {
    return _array[index];
}
于 2013-04-01T23:53:32.430 に答える