如何在C++中重载运算符 [ ]
How to overload operator [ ] in C++?
我在C++矩阵重载operator []
时遇到了一些问题。假设在我的Class Matrix
我有一个 2X2 matrix m[2][2]
.如果我想从数组中调用元素m[1][1]
而不是object.m[1][1]
,代码应该是什么样子?我想标题应该是类似int operator[] (const int)
但我不知道如何构建它......如果有人能提前帮助我,谢谢。
有两种解决方案。 首先,正如@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 版本,在为了在康斯特上超载[]
。
对于()
版本,只需将getRef
替换为operator()
(字面意思),并删除Proxy
和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;
}
}
相关文章:
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- <T> 通过模板化运算符重载将 std::complex 乘以双倍
- C++20概念:需要运算符重载
- 使用赋值运算符重载从类中返回jobject
- 在运算符重载定义中使用成员函数(const错误)
- 字节到位运算符重载C++
- 为什么在运算符重载时需要参考?
- 类中 c++ 的运算符 + 重载
- 算术复合运算符重载为非成员
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 交换运算符 + 重载会导致无限递归
- 如何理解新的运算符重载?
- 向量保持复数的运算符重载
- 如何创建运算符重载?
- 链接列表运算符重载没有打印出我想要的内容
- C++:需要帮助了解运算符重载错误
- 使用模板化运算符重载 XOR 运算符失败
- 如何确保接受的C++模板类型使运算符重载?
- 运算符重载使用运算符+添加类模板