我有以下课程重载操作符
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
class Cvector
{
public:
int x,y;
Cvector() { x=0;y=0;}
Cvector(int,int);
Cvector operator+(Cvector);
Cvector operator-(Cvector);
int operator*(Cvector);
bool operator==(Cvector);
Cvector operator*(int);
Cvector operator=(Cvector);
int cross_multiplication(Cvector,Cvector);
float norm();
};
Cvector Cvector::operator=(Cvector a)
{
x=a.x;
y=a.y;
return *this;
}
bool Cvector::operator==(Cvector b)
{
return (x==b.x && y==b.y);
}
Cvector Cvector::operator*(int c)
{
Cvector temp;
temp.x=c*x;
temp.y=c*y;
return temp;
}
float Cvector::norm()
{
float result=0;
result+=x*x+y*y;;
return sqrt(result);
}
Cvector::Cvector(int a,int b)
{
x=a;
y=b;
}
Cvector Cvector::operator+(Cvector a)
{
Cvector temp;
temp.x=x+a.x;
temp.y=y+a.y;
return temp;
}
Cvector Cvector::operator-(Cvector b)
{
Cvector temp;
temp.x=x-b.x;
temp.y=y-b.y;
return temp;
}
int Cvector::operator*(Cvector a)
{
return x*a.x+y*a.y;
}
int main()
{
Cvector a(3,4);
Cvector b(4,5);
cout<<b.norm()<<endl;
Cvector c;
c=a*b;
cout<<(a==b)<<endl;
return 0;
}
但它给了我一个错误
1>c:\users\dato\documents\visual studio 2010\projects\point_class\point_class\point_class.cpp(86): error C2679: binary '=' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)
1> c:\users\dato\documents\visual studio 2010\projects\point_class\point_class\point_class.cpp(16): could be 'Cvector Cvector::operator =(Cvector)'
1> while trying to match the argument list '(Cvector, int)'
请帮我解决这个问题
答案 0 :(得分:4)
根本原因:
int Cvector::operator*(Cvector a)
返回int
,所以:
c=a*b;
尝试将int
分配给Cvector
对象,该对象需要=
类的Cvector
运算符重载,以int
作为参数,没有。因此错误。
建议的解决方案:
c
没有业务是Cvector
,理想情况下它应该是int
,所以要么它可能是拼写错误,要么它确实可能是意图(打破传统的代数威斯顿)。我不确定它是哪一个。
如果是前者,只需将c
的类型更改为int
。
如果是后者,则需要提供一个带有int
参数的构造函数:
Cvector::Cvector(int)
{
}
此构造函数将隐式调用以转换int
的{{1}}结果并将其转换为operator *
对象,然后将其用于调用Cvector
。
答案 1 :(得分:3)
您的乘法运算符int Cvector::operator*(Cvector a)
返回int
。然后,您尝试将此int
分配给Cvector c
。您的班级中没有此类分配操作符,可以将int
转换为Cvector
。
要解决此问题,您需要从Cvector
返回Cvector::operator*
(例如在operator+
中)或定义获取int
作为输入参数的赋值运算符(不是对我来说很有意义,但是......)
答案 2 :(得分:2)
问题在于:
int Cvector::operator*(Cvector a)
{
return x*a.x+y*a.y;
}
您正在从此乘法中重新调整一个int,您尝试在此处分配Cvector
:
c=a*b;
这里的解决方案是分配一个整数:
int dotProd = a*b;
由于至少有两个有意义的向量乘法运算(标量和向量积),因此完全删除运算符并添加特定的dot(const Cvector&)
和cross(const Cvector&)
方法可能是有意义的。
您的代码中也存在一些奇怪之处。例如,这里:
Cvector Cvector::operator+(Cvector a)
{
Cvector temp;
temp.x=x+a.x;
temp.y=y+a.y;
return temp;
}
您按值Cvector
,因此不需要temp
副本。您可以直接在a
上操作并将其返回。