0

我有以下带有重载运算符的课程

#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)'

请帮我解决这个问题

4

3 回答 3

4

根本原因:

int Cvector::operator*(Cvector a)

返回一个int,所以:

c=a*b;

尝试将 an 分配int给一个对象,该对象需要一个类Cvector的重载=运算符作为参数,但它不需要。因此错误。Cvectorint

建议的解决方案:

c没有业务Cvector,它应该是int理想的,所以它可能是一个错字,或者它确实可能是意图(这确实打破了传统的代数智慧)。我不确定它是哪一个。

如果是前者,只需将类型更改cint

如果是后者,您需要提供一个接受int参数的构造函数:

Cvector::Cvector(int)
{

}

此构造函数将隐式调用以转换int结果operator *并将其转换为一个Cvector对象,然后该对象将用于调用operator =.

使用建议的解决方案在线演示您的代码

于 2012-09-01T13:38:27.517 回答
3

您的乘法运算符int Cvector::operator*(Cvector a)返回int. 然后您尝试将其分配intCvector c. 您的类中没有这样的赋值运算符允许int转换为Cvector.

要解决此问题,您需要CvectorCvector::operator*(如 in operator+)返回或定义int作为输入参数获取的赋值运算符(对我来说没有多大意义,但是......)

于 2012-09-01T13:38:11.797 回答
2

问题在这里:

int Cvector::operator*(Cvector a)
{
    return x*a.x+y*a.y;
}

您正在从该乘法中返回一个 int,您尝试将其分配给 a 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并返回它。

于 2012-09-01T13:38:59.050 回答