我试图/为一个Polynomial类重载除法运算符,但算法本身是无关紧要的.问题是当我试图以某种未知的原因返回时,C++似乎正在破坏我的多项式.
这是班级的相关部分:
class Polynomial
{
public:
.........
Polynomial &operator/(const double &) const;
private:
int DEGREE;
std::vector<double> poly_terms; // stores the polynomial coefficients
.........
}
Run Code Online (Sandbox Code Playgroud)
这是我无法正常工作的方法:
Polynomial &Polynomial::operator/(const double &rhs) const
{
Polynomial result(10); //create new polynomial object with a maximum degree of 10
double buffer;
for(int i = 0; i <= DEGREE; i++)
{
buffer = poly_terms[i]; //poly_terms is of type vector<double>
result.setCoeff(i, buffer / rhs); //this method assigns (buffer / rhs) to the i-th index of result's vector data-member.
}
return result; //return Polynomial instance
}
Run Code Online (Sandbox Code Playgroud)
在return子句执行之前,调试器显示result对象的所有数据成员都正确设置了它们的值,因为算法应该设置它们,包括vector数据成员.所以在return返回之前,result100%正确构建,因此方法的逻辑到目前为止似乎很好.
但是在return声明执行完毕后,一切都很难完成.由于某种原因,返回的对象将其vector数据成员更改为空vector(奇怪的是,所有其他不是对象的数据成员,就像DEGREE它们一样保持正常).我不确定它是否是以某种方式被清空的相同矢量对象,或者如果它是包含该矢量对象的多项式对象的失败副本.
有谁知道为什么会这样,我怎么能避免它?
UPDATE1:
我应该提一下,我也试过Polynomial用这个方法创建对象new.而且我还试图通过删除像&这样的标题来返回引用Polynomial Polynomial::operator/(const double &rhs) const.但是这两者都对vector数据成员产生了类似的不良影响.
更新2: 似乎我能够追踪问题,感谢那些提到我不应该返回引用的人.问题在于需要重载复制构造函数并重载赋值运算符以手动执行向量数据成员的副本(不确定是否需要两者,我只是实现了所有这3个东西,现在它完美地工作) .感谢大家帮忙排除故障.
好吧,你返回一个局部变量的引用.任何将使用该变量的代码都将是未定义的行为.您的案例有一个简单的解决方案:删除&
// Notice that the function is not returning a reference anymore
Polynomial Polynomial::operator/(const double &rhs) const
{
Polynomial result(10); //create new polynomial object with a maximum degree of 10
double buffer;
for(int i = 0; i <= DEGREE; i++)
{
buffer = poly_terms[i]; //poly_terms is of type vector<double>
result.setCoeff(i, buffer / rhs); //this method assigns (buffer / rhs) to the i-th index of result's vector data-member.
}
return result; //return Polynomial
}
Run Code Online (Sandbox Code Playgroud)
您可能认为它会降低您的代码速度,因为它会复制变量result.这是错误的.您的代码将使用copy elision.这意味着没有从return语句中复制的副本.
即使你的编译器很笨并且不使用copy elision,它也会使用你的类的移动构造函数,它仍然比副本快得多.
要阅读有关复制省略的更多信息,请查看此处的文档页面:复制省略
| 归档时间: |
|
| 查看次数: |
181 次 |
| 最近记录: |