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つのエラーを与えます

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;

intCvectorオブジェクトに割り当てようとしますが、クラスのオーバーロードされた=演算子をパラメーターとして受け取る必要がありますが、そうではありません。したがって、エラー。Cvectorint

推奨される解決策:

cCvectorはであることに何のビジネスもintありません。

前者の場合は、 type をcに変更するだけintです。

後者の場合は、intパラメーター を受け取るコンストラクターを提供する必要があります。

Cvector::Cvector(int)
{

}

intこのコンストラクターは、 の結果をoperator *変換し、それをCvectorオブジェクトに変換するために暗黙的に呼び出されます。このオブジェクトは、 を呼び出すために使用されますoperator =

提案されたソリューションを含むコードのオンライン デモ

于 2012-09-01T13:38:27.517 に答える
3

乗算演算子は をint Cvector::operator*(Cvector a)返しますintint次に、これをに割り当てようとしCvector cます。あなたのクラスにはint、 に変換できるような代入演算子はありませんCvector

これを解決するには、 (のように)Cvectorから戻るか、入力パラメータとして取得する代入演算子を定義する必要があります(私にはあまり意味がありませんが...)Cvector::operator*operator+int

于 2012-09-01T13:38:11.797 に答える
2

問題はここにあります:

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

Cvectorこの乗算から int を返しています。これをここに割り当てようとしています。

c=a*b;

ここでの解決策は、整数に割り当てることです。

int dotProd = a*b;

少なくとも 2 つの意味のあるベクトル乗算演算 (スカラーとベクトル積) があるため、演算子を完全に削除して特定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 に答える