c++ - 如何重载 [] 运算符以支持其他函数中的赋值和 const 参数?
问题描述
考虑一个类SomeClass
:
class SomeClass{
public:
// Constructors, other members
float& operator[](const unsigned i);
friend bool operator==(const SomeClass &A, const SomeClass &B);
};
假设这是==
该类的运算符重载方式(不是实际实现,而是过于简化的版本):
bool operator==(const SomeClass &A, const SomeClass &B){
if (A[0] == B[0])
return true;
return false;
}
这将引发编译器错误,因为重载[]
运算符要求实例为非const
. 但是,如果我更改[]
运算符的定义以允许const
实例,我将无法再进行赋值:
// ASSUMING: const float& operator[](const unsigned i) const;
SomeClass a;
a[0] = 0; // error, because the return value of [] is a reference to const!
我真的不想删除运算符const
的参数==
,因为操作数在函数内不会改变。处理这个问题的正确方法是什么?
解决方案
重载operator []
以提供两者:
float& operator [](unsigned int i);
float operator [](unsigned int i) const;
对于复制成本不高的泛型T
,请使用T const&
返回值。实现读/写的一般模式operator []
是
T& operator [](index_type i);
T const& operator [](index_type i) const;
推荐阅读
- python - 如何使用python从熊猫数据框中将电子邮件发送到具有不同主题的不同收件人地址
- flutter - 带有 JSON 正文的 Flutter 推送通知
- python - 如何从 statsmodel 中的滚动回归模块进行预测?
- python-3.x - “fit() 缺少 1 个必需的位置参数:'y'”错误
- python - 使用 Python 在网站上抓取和绘制连接页面的最佳方法是什么?
- python - Django python如何在模型中获取多个图像
- javascript - angularJS 数组元素显示为未定义
- php - 这个ereg代码怎么可能更新为preg_match?
- python-3.x - 我们可以在序列化程序类本身中强制使用任何一个序列化程序字段吗?
- reactjs - 无法在反应选择组中做出改变