我在C ++中为矩阵重载operator []
时遇到了一些问题。让我说在我的Class Matrix
我有一个2X2 matrix m[2][2]
。如果我想要代码应该是什么样的调用数组m[1][1]
而不是object.m[1][1]
中的元素?我想标题应该是int operator[] (const int)
,但我不知道如何建立...如果有人可以提前帮助我。
答案 0 :(得分:5)
有两种解决方案。首先,正如@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()
(从字面上看),然后删除Proxy
和operator[]
。
答案 1 :(得分:1)
这是一个如何为具有二维数组的类实现operator []的示例 尝试一下,你会感到满意。:)
您既不需要代理也不需要复合运算符函数。
#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;
}
}