我目前正在Polynomial
用C++ 编写一个-class,它应该表示以下形式的多项式:
p(x) = a_0 + a_1*x^1 + a_2*x^2 + ... + a_i*x^i
a_0, ..., a_i
所有人都在哪里int
.
该类在内部使用a_
类型的成员变量std::vector
来存储常量因子a_0, ..., a_i
.要访问常量因子operator[]
,请按以下方式重载:
读和写:
int &operator[](int i) { return a_.at(i); }
尝试使用以下方法更改其中一个因素时,这将失败a_i
:
i > degree of polynomial = a_.size() - 1
只读:
int operator[](int i) const { if (i > this->degree()) { return 0; } return a_.at(i); }
稍微不同的实现允许相当舒适地循环两个不同大小的多项式的因子(不用担心多项式的程度).
可悲的是,我似乎错过了一些东西,因为operator+
-overloading(使用这个舒适的只读 - operator[]
)失败了.
operator+
- 超载:
Polynomial operator*(const Polynomial &other) { Polynomial res(this->degree() + other.degree()); for (int i = 0; i <= res.degree(); ++i) { for (int k = 0; k <= i; ++k) { res[i] += (*this)[k] * other[i-k]; } } return res; }
不介意所涉及的数学.重要的是,它i
始终在范围内
0 <= i < res.a_.size()
因此写入res[i]
是有效的.然而(*this)[k]
,other[i-k]
尝试从不一定在该范围内的指数中读取[0, (*this).a_.size() - 1]
.
这对我们的只读 -实现operator[]
权利应该没问题?尝试访问a_
无效索引时仍然出错.什么可能导致编译器在行中使用读写 -implementation:
res[i] += (*this)[k] * other[i-k];
尤其是平等右侧的部分.
我敢肯定,错误是由"错误"的使用造成的读取和写入 - operator[]
.因为通过附加检查修复了无效访问:
if (k <= this->degree() && i-k <= other.degree()) { res[i] += (*this)[k] * other[i-k]; }
使用operator[]
-overloading 我错过了什么?为什么不是只读 - operator[]
在这里使用?
(*this)[k]
使用非const this
作为包含它的函数不是const
.
因此[]
编译器首选非const重载.
你可以用一个丑陋的方式绕过这个const_cast
,但实际上你应该保持[]
运算符的两个版本的行为尽可能相似.此外,std::vector
重载[]
并不坚持对索引进行检查,而不是at
必须检查.您的代码与此有所不同,因此可能会使您的代码感到困惑.