过载=操作者类应行为像矩阵[复制](Overload = operator for class th

2019-10-17 22:27发布

这个问题已经在这里有一个答案:

  • 如何重载数组索引运算符包装类二维数组的? 2个回答

我有一个行为应该像矩阵类的模板。 因此,用例是这样的:

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;
}

Answer 1:

如果您打算修改通过代理服务器,那么超载引用矩阵的元素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]接口。



Answer 2:

问题是,你在返回代理:: operator []的一个int值。 第一个[]操作返回代理对象,所述第二返回int。 如果您的代理[]操作是返回一个int的参考,那么你就能够分配给它:

int& operator[](int index) {
    return _array[index];
}


文章来源: Overload = operator for class that shall behave like matrix [duplicate]