如何在C ++中重载operator []?

时间:2014-02-24 17:36:53

标签: c++ matrix operators overloading

我在C ++中为矩阵重载operator []时遇到了一些问题。让我说在我的Class Matrix我有一个2X2 matrix m[2][2]。如果我想要代码应该是什么样的调用数组m[1][1]而不是object.m[1][1]中的元素?我想标题应该是int operator[] (const int),但我不知道如何建立...如果有人可以提前帮助我。

2 个答案:

答案 0 :(得分:5)

有两种解决方案。首先,正如@chris建议的那样,你可以使用 operator()( int i, int j );很多以数学为导向的 人们甚至更喜欢这个。否则,operator[]必须返回 代理人;也定义了[]的类型 可以应用第二个[]来返回正确的结果。对于 二维结构,最简单的代理只是一个指针 到行,因为[]是为指针定义的。但它经常发生 最好返回一个完整的类类型,以便做错误 检查。类似的东西:

template <typename T>
Matrix2D
{
    int myRowCount;
    int myColumnCount;
    std::vector<T> myData;
public:
    T& getRef( int i, int j )
    {
        return myData[ i * myRowCount +  j ];
    }

    class Proxy
    {
        Matrix2D* myOwner;
        int myRowIndex;
    public:
        Proxy( Matrix2D* owner, int i )
            : myOwner( owner )
            , myRowIndex( i )
        {
        }

        T& operator[]( int j )
        {
            return myOwner->getRef( myRowIndex, j );
        }
    };

    Proxy operator[]( int i )
    {
        return Proxy( this, i );
    }
};

你可能也想要一个const版本的代理 为了在const上重载[]

对于()版本,只需将getRef替换为operator() (从字面上看),然后删除Proxyoperator[]

答案 1 :(得分:1)

这是一个如何为具有二维数组的类实现operator []的示例 尝试一下,你会感到满意。:)

您既不需要代理也不需要复合运算符函数。

#include <iostream>

int main()
{
    struct A
    {
        int a[10][10];
        int ( & operator []( int n ) )[10]
        {
            return ( a[n] );
        }
    };

    A a;

    for ( int i = 0; i < 10; i++ )
    {
        for ( int j = 0; j < 10; j++ )
        {
            a[i][j] = 10 * i + j;
        }
    }

    for ( int i = 0; i < 10; i++ )
    {
        for ( int j = 0; j < 10; j++ )
        {
            std::cout << a.a[i][j] << ' ';
        }
        std::cout << std::endl;
    }
}