重载运算符[]

时间:2014-12-06 08:34:27

标签: c++ arrays multidimensional-array

我重载了一个操作符[],但它没有按照我的意愿工作。

    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 这段代码有什么问题?

1 个答案:

答案 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]返回ea[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 )。