This question already has answers here:
How to overload array index operator for wrapper class of 2D array? [duplicate]

(2个答案)


7年前关闭。




我有一个类似矩阵的类的模板。
所以用例是这样的:
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;
}

最佳答案

如果打算修改代理引用的矩阵元素,则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]接口(interface)。

关于c++ - 重载=类的运算符,其行为应类似于矩阵,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15753800/

10-15 07:18