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 值。您的第一个 [] 运算符返回代理对象,第二个返回一个 int。如果您的代理 [] 运算符要返回一个 int 引用,那么您将能够分配给它:

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