gpt4 book ai didi

C++:关于重载运算符的后续操作

转载 作者:行者123 更新时间:2023-11-30 02:28:58 26 4
gpt4 key购买 nike

#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 并定义了两个运算符 + 和 *。我想像使用 + 和 * 表示整数和 double 一样简单地使用这些运算符。因此,我在主 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 中的一个函数,我绝对无权更改。

最佳答案

最好将operator+operator* 定义为友元函数,这样如果存在从其他类型到CLS 的隐式转换,则可以使用运算符。如果它是一个成员函数,那么如果第一个操作数不是 CLS,就不会找到它。

friend CLS operator+(CLS lhs, const CLS& rhs) 
{
// Do your logic here
return lhs;
}

关于C++:关于重载运算符的后续操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40165645/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com