如何链接多个运算符[]

时间:2015-10-27 08:57:18

标签: c++ class operator-overloading

我正在尝试创建一个使用operator []的类,如

MyClass[x][y]

它应该根据我在类中定义的函数中调用的值返回一个值。到目前为止我所拥有的是:

MyClass.h

class MyClass{
   public:
          // return one value of the matrix
     friend double operator[][] (const int x, const int y); 
   }

我甚至不认为我的语法是正确的,如何在MyClass.cpp中编写此函数来定义应返回的值?

就像它一样:

MyClass::friend double operator[][] (const int x, const int y)
{
  // insert code here
}

试了但是它一直在说错误。我相信这是一个烂摊子......

非常感谢,

4 个答案:

答案 0 :(得分:1)

您需要为该行返回代理对象。这是一个非常简单的例子,只是为了让你前进。我没有尝试过编译它。

class Matrix {
   int data[4][4];

   class Row {
      Matrix* matrix;
      int row;

      int operator[](int index){
        return matrix->data[row][index]; // Probably you want to check the index is in range here.
      }

   }

   Row operator[](int row){
     Row which_row;
     which_row.matrix = this;
     which_row.row = row; // beware that if the user passes the row around it might point to invalid memory if Matrix is deleted.
     return which_row;
   }
}

您也可以直接从operator[]返回该行,并将第二个[]保留为直接阵列访问权限。恕我直言,它对代理对象很好,因为它可以对索引进行一些检查,并可能有其他很好的成员函数。

答案 1 :(得分:1)

重载operator()绝对是最干净的方法。

但是,请记住这是C ++,您可以根据自己的意愿弯曲语法:)

特别是,如果你坚持想要使用myclass[][],你可以通过声明一个"中间类"来做到这一点,这是一个例子:

Run It Online

#include <iostream>
using std::cout;
using std::endl;

class MyClass {
public:

    using IndexType  = int;
    using ReturnType = double;

    // intermediate structure
    struct YClass {
        MyClass&  myclass;
        IndexType x;
        YClass (MyClass& c, IndexType x_) : myclass(c), x(x_) {}
        ReturnType operator[](IndexType y_) { return myclass.compute(x, y_); }
    };


    // return an intermediate structure on which you can use opearator[]
    YClass operator[](IndexType x) { return {*this, x}; }

    // actual computation, called by the last "intremediate" class
    ReturnType compute(IndexType x, IndexType y) {
        return x * y;
    }
};

int main()
{
    MyClass myclass;

    cout << myclass[2][3] << endl;  // same as: cout << myclass.compute(2, 3) << endl;
}

答案 2 :(得分:0)

没有operator[][]。但您可以申报operator()(int, int)

class Foo {
public:
  double operator()(int a, int b) {
    //...
  }
};

答案 3 :(得分:0)

如果您正在尝试创建4x4 Matrix类,我这样做的方式以及它在D3DX库中完成的方式是在类中有一个成员变量:

class Matrix
{
public:
    // publicly accessible member 4x4 array
    float m[4][4];

    // also accessible via () operator. E.G. float value = mtx(3,2);
    float operator()(int column, int row);
}