为点坐标创建类

时间:2012-09-01 13:33:08

标签: c++ overloading

我有以下课程重载操作符

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

请帮我解决这个问题

3 个答案:

答案 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

<强> Online Demo of your code with suggested solution

答案 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上操作并将其返回。