【发布时间】:2016-10-20 22:39:31
【问题描述】:
#include <iostream>
#include <vector>
using namespace std;
void testfn(double* v1, double *v2, double *v3, int n);//I must use this function
class CLS{
private:
vector<double> v;
public:
CLS(vector<double> vin);
CLS operator+(CLS & A);
CLS operator*(CLS & A);
};
CLS::CLS(vector<double> vin)
{
v=vin;
}
CLS CLS::operator*(CLS &A){
//assuming the two vectors have the same length
vector<double> vtmp(v.size(),0);
testfn(&*A.v.begin(),&*v.begin(),&*vtmp.begin(),(int)A.v.size());
CLS C(vtmp);
return C;
}
CLS CLS::operator+(CLS &A){
//assuming the two vectors have the same length
vector<double> vtmp(v.size(),0);
testfn(&*A.v.begin(),&*v.begin(),&*vtmp.begin(),(int)A.v.size());
CLS C(vtmp);
return C;
}
void testfn(double* v1, double *v2, double *v3, int n)
{
for (int i=0;i<n;i++)
{
*v3=*v1+*v2;
++v1;
++v2;
++v3;
}
}
int main(){
vector<double> v1(100,1.0), v2(100,2.0), v3(100,0.0);
CLS C1(v1),C2(v2),C3(v3);
CLS C4=C1*(C1+(C2*C3+C2))*C1*C2*C3+C1+C2+C3;
return 0;
}
我创建了 CLS 类并定义了两个运算符 + 和 *。我想像使用 + 和 * 处理整数和双精度一样简单地使用这些运算符。因此我在主CLS C4=C1*(C1+(C2*C3+C2))*C1*C2*C3+C1+C2+C3; 中有一条测试线。但是,在使用 gcc 编译此代码时出现大量错误。我对运算符重载的规则不够熟悉。我应该如何修改 * 和 + 的定义(可能只是参数?)以使CLS C4=C1*(C1+(C2*C3+C2))*C1*C2*C3+C1+C2+C3; 有效?
补充:operator+和*的const参数我不知道,因为这两个运算符的定义涉及到另一个函数testfn,其参数是double*而不是const double*。此外,我不想更改testfn 定义中的任何部分,因为在我的真实代码中,它对应于LAPACK 中的一个函数,我绝对无权更改。
【问题讨论】:
-
"我对运算符重载的规则不够熟悉。"谷歌搜索“C++ 运算符加重载”有那么难吗?
-
在“授人以渔”行here's the reference for 'binary operation overload'。请随意阅读整个页面(适用于所有运营商)。
-
@AdrianColomitchi 我在原帖中添加了一些解释,说明为什么我不能对 + 和 * 使用 const 参数。这些困难完全有可能得到解决。但我不知道怎么做。
-
如果您确定
testfn不会修改*v1或*v2,那么您可以在调用testfn时安全地丢弃这些参数上的const。 -
@Resorter C++11 你说?也许是时候让您了解
move copy和move assign而不是依赖编译器生成的了?另见the rule of 5/3/0。相关性:您按值返回对象,应该了解其背后的机制,
标签: c++ class operator-overloading