This question already has answers here:
How to overload array index operator for wrapper class of 2D array? [duplicate]
(2个答案)
7年前关闭。
我有一个类似矩阵的类的模板。
所以用例是这样的:
当我直接在构造函数中设置值时,它很好用,但是当我想使用
码:
目前,您返回的
实际上,由于
除非您想一次分配整行,否则不需要重载
(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