如何在C++中重载运算符 [ ]

How to overload operator [ ] in C++?

本文关键字:运算符 重载 C++      更新时间:2023-10-16

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

有两种解决方案。 首先,正如@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 版本,在为了在康斯特上超载[]

对于()版本,只需将getRef替换为operator()(字面意思),并删除Proxyoperator[].

下面是一个如何为具有二维数组的类实现运算符 [] 的示例尝试一下,你会满意的:)

您将不需要代理或复合运算符函数。

#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;
    }
}