【问题标题】:C++ Overloading : Overloading the [][] operator [duplicate]C++ 重载:重载 [][] 运算符 [重复]
【发布时间】:2011-10-27 22:10:46
【问题描述】:

问题是是否可以重载 [ ][ ] 。

在像vector> 这样的正常情况下,我们正在重载[ ] 操作符。

但是如果为 [ ][ ] 定义特殊含义,是否可以有这样的运算符

【问题讨论】:

标签: c++ overloading


【解决方案1】:

没有特殊的 [][] 运算符;它的 operator[] 应用于另一个 operator [] 的结果。

您可以通过让第一个运算符返回一个特殊的临时对象来赋予 [][] 构造特殊的含义,该对象也具有 [] 运算符。

【讨论】:

    【解决方案2】:

    不,您必须重载 [] 才能返回一个本身已重载 [] 的值。

    【讨论】:

      【解决方案3】:

      正如其他人指出的那样,没有[][] 运算符,它是[] 运算符应用于 [] 运算符的结果。在最一般的 情况下,第一个 [] 运算符将返回一个代理,它实现 本身是[] 运算符。在最简单的情况下,“代理” 可以是T*,因为在 C++ 中,指针实现了[] 运算符。一种 更通用的实现可能是这样的:

      class ElementProxy
      {
          Container* myOwner;
          int myRowIndex;
          int myColumnIndex;
      public:
          ElementProxy( Container* owner, int rowIndex, int columnIndex )
              : myOwner( owner )
              , myRowIndex( rowIndex )
              , myColumnIndex( columnIndex )
          {
          }
      
          operator Type() const  //  lvalue to rvalue conversion
          {
              return myOwner->get( myRowIndex, myColumnIndex );
          }
      
          void operator=( Type const& rhs ) const
          {
              myOwner->set( myRowIndex, myColumnIndex, rhs );
          }
      };
      
      class RowProxy
      {
      public:
          RowProxy( Container* owner, int rowIndex )
              : myOwner( owner )
              , myRowIndex( rowIndex )
          {
          }
          ElementProxy operator[]( int columnIndex ) const
          {
              return ElementProxy( myOwner, myRowIndex, columnIndex );
          }
      };
      

      这并不完美;如果您正在处理类类型,那是不可能的 支持某事线container[i][j].x,例如;我们不能 过载operator.。如果你需要支持这个,关于最好的你 可以做的是在ElementProxy 上重载operator->,并要求 使用-> 而不是. 的客户端代码,即使它不是真正的 指针,智能或其他。

      【讨论】:

      • +1 写了这么多,用一个例子来说明它。 :-)
      • 对了,为什么是impossible to support something like container[i][j].x?我认为我们可以。在您的代码中,不需要ElementProxy。相反,如果RowProxy 定义了一个成员value_type row*,那么operator[] 可以简单地这样做:return row[columnIndex];。这样就可以写container[i][j].x.
      • @Nawaz 如果您使用value_type* 作为元素代理,则没有问题。但是,假设您正在实现某种稀疏矩阵,其中没有 C 样式(子)向量形式的完整行。或者只是您想要对行和列索引进行边界检查的地方。一旦您需要元素代理的类类型,您就会陷入困境; operator. 不起作用。
      • 即使使用我建议的这种方法也可以进行边界检查。至于稀疏矩阵,那是个特例,我也不是很了解,或者,这种情况,我们可以专门化模板,或者根据它是否稀疏矩阵,我们可以选择value_type,并相应地工作。
      • @Nawaz 在某些情况下,可以实现边界检查:RowProxy 不会返回ElementProxy,而是立即调用myOwner->get(...)。如果这个函数返回一个引用,而operator[]也返回一个引用,应该没有问题。然而,在很多情况下,元素不一定存在于内存中,您需要ElementProxy
      【解决方案4】:

      有两个运算符。 要执行您想要的操作,您必须重载返回对象向量的 operator[]。

      【讨论】:

        【解决方案5】:

        c++中的下标运算符是[]。当您使用类似“object[][]”这样的语法时,您正在调用运算符 [] 来为第一个对象创建脚本,然后在第一个对象选择的对象上调用第二个运算符 []。

        基本上你不能重载操作符“[][]”,因为这个操作符不存在。您应该在容器对象上重载下标运算符,然后在内部对象中也重载它。

        【讨论】:

          猜你喜欢
          • 2012-12-22
          • 2016-09-26
          • 2012-04-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-29
          相关资源
          最近更新 更多