当前位置:  开发笔记 > 编程语言 > 正文

为什么不使用只读[]运算符?

如何解决《为什么不使用只读[]运算符?》经验,为你挑选了1个好方法。

我目前正在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[]在这里使用?



1> Bathsheba..:

(*this)[k]使用非const this作为包含它的函数不是const.

因此[]编译器首选非const重载.

你可以用一个丑陋的方式绕过这个const_cast,但实际上你应该保持[]运算符的两个版本的行为尽可能相似.此外,std::vector重载[]并不坚持对索引进行检查,而不是at必须检查.您的代码与此有所不同,因此可能会使您的代码感到困惑.

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有