【问题标题】:How to overload operator [ ] in C++?如何在 C++ 中重载运算符 []?
【发布时间】:2014-02-24 17:36:52
【问题描述】:

我在 C++ 中为矩阵重载 operator [] 时遇到了一些问题。假设在我的 Class Matrix 中我有一个 2X2 matrix m[2][2]。如果我想从数组 m[1][1] 而不是 object.m[1][1] ?我想标题应该类似于int operator[] (const int) 但我不知道如何构建它...如果有人可以帮助我提前感谢。

【问题讨论】:

  • 我建议坚持使用m(1, 1)
  • @chris,非常欢迎初学者补充说明
  • @piotruś 他提出了一种经典的解决方案:重载operator()( int i, int j ) 以返回对单个元素的引用,然后使用m( i, j ) 而不是m[i][j]。无论如何,很多数字专家似乎更喜欢这种形式。
  • 当然,我只是建议在简短粗略的推荐之后明确地写这个

标签: c++ matrix operators overloading


【解决方案1】:

有两种解决方案。首先,正如@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[]

【讨论】:

  • 非常感谢。我实现了“@chris”解决方案,效果很好。我从没想过用 () 代替 []。
  • @user3187893 两种解决方案都运行良好。这是用户偏好的问题。在这里,我们也使用了@chris 解决方案,用户似乎对此很满意;但在我之前工作过的地方,代理解决方案(和m[i][j])是首选。
  • 天哪,我越来越受欢迎了。谢谢你在我离开太久后把它画出来。
【解决方案2】:

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

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

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

【讨论】:

  • 哇。 operator[] 的声明让我头疼。如果有其他人没有立即点击,那么在 C++ 中声明对 10 个 ints 数组的引用 a 的方法是使用稍微奇怪的语法 int (&amp;a)[10]。此示例更进一步,将a 替换为operator[](int n)(即运算符返回对大小为10 的int 数组的引用)。它是合法的,它有效,而且它当然很聪明,但我不确定我对此有何感想......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多