我重载了一个操作符[],但它没有按照我的意愿工作。
class A{
int *const e;
const int row, column;
public:
int rows() const
{
return row;
}
int columns() const
{
return column;
}
int size() const
{
return row * column;
}
A(int r, int c)
: row(r), column(c), e(new int[r*c])
{
for (int i = 0; i < r*c; i++)
{
e[i] = 0;
}
}
virtual int *const operator[ ](int r)
{
return &e[r*row];
}
}
例如: 如果我写道:
A a(2, 5)
a[0][0] = 1; // OK
a[0][1] = 2; // OK
a[0][2] = 3; // It's assigned a [0][2] == 3 but also [1][0] == 3
我找不到问题。它应该只为[0] [2]赋值3 这段代码有什么问题?
答案 0 :(得分:3)
因为a[0][2]
和a[1][0]
是同一个。我们来看看:
&e[r*row]
与&(*(e+(r*row)))
(根据[]
的定义)相同,与(e+(r*row))
相同。
如果r
为0,则只有e
,如果r
为1,则为(e+row)
。如果您的row
为2,则为e+2
。
所以a[0]
返回e
,a[1]
返回e+2
。
现在a[0][2]
(a[0])[2]
为e[2]
,而a[1][0]
为(e+2)[0]
为e[2]
。看到?同样的事情。
如果row
是行数而column
是列数,正如您的意图所示,您最好从&e[r*column]
返回operator[]
(因为列数是一行的 size )。