我正在尝试创建一个使用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
}
试了但是它一直在说错误。我相信这是一个烂摊子......
非常感谢,
答案 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[][]
,你可以通过声明一个"中间类"来做到这一点,这是一个例子:
#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);
}