c++的另一个类成员和重载操作符

C++ another class member and overloading operator

本文关键字:重载 操作符 成员 另一个 c++      更新时间:2023-10-16

我需要编写如下程序:

#include <iostream>
using namespace std;
class Point
{
    public:
        double X;
        double Y;
        Point(){}
        Point(double x, double y)
        {
            X = x;
            Y = y;
        }
};
class Circle
{
    public:
        Point P;
        double R;
        Circle(){}
        Circle(Point p, double r)
        {
            P = p;
            R = r;
        }
        Circle operator +(Circle C1, Circle C2)
        {
            return Circle(C1.Point, C1.R + C2.R);
        }
        Circle operator -(Circle C1, Circle C2)
        {
            return Circle(C2.Point, C1.R - C2.R);
        }
};
int main()
{
    Circle c1, c2, cr1, cr2, ck1, ck2;
    // create c1
    // create c2
    cr1 = c1 + c2;
    // display cr1
    cr2 = c2 + c1;
    // display cr2
    ck1 = c1 - c2;
    // display ck1
    ck2 = c2 - c1;
    // display ck2
    return 0;
}

两个类Point和Circle,其中Circle以Point的成员为中心,两个操作符分别对两个Circle进行加减运算。

我不能编译这个,怎么了?

#################################################################################

编辑:修改后看起来像这样,并且工作完美:

#include <iostream>
using namespace std;
class Point
{
    public:
        double X, Y;
        Point(){}
        Point(double x, double y)
        {
            X = x;
            Y = y;
        }
};
class Circle
{
    public:
        double R;
        Point P;
        Circle(){}
        Circle(Point p, double b)
        {
            P = p;
            R = b;
        }
        Circle operator+(const Circle& C1)
        {
            Circle C;
            C.P = this->P;
            C.R = this->R + C1.R;
            return C;
        }
        Circle operator -(const Circle& C1)
        {
            Circle C;
            C.P = C1.P;
            C.R = this->R - C1.R;
            return C;
        }
};
int main()
{
    double X, Y, R;
    cout << "Coordinates for C1:" << endl;
    cout << "tX: ";
    cin >> X;
    cout << "tY: ";
    cin >> Y;
    cout << "Radius for C1:";
    cin >> R;
    Circle *c1 = new Circle(Point(X, Y), R);
    cout << "Coordinates for C2:" << endl;
    cout << "tX: ";
    cin >> X;
    cout << "tY: ";
    cin >> Y;
    cout << "Radius for C2:";
    cin >> R;
    Circle *c2 = new Circle(Point(X, Y), R);
    Circle cs1 = c1->operator+(*c2);
    Circle cs2 = c1->operator-(*c2);
    Circle cr1 = c2->operator+(*c1);
    Circle cr2 = c2->operator-(*c1);
    cout << "cs1([" << cs1.P.X << ", " << cs1.P.Y << "], " << cs1.R << ")" << endl;
    cout << "cs2([" << cs2.P.X << ", " << cs2.P.Y << "], " << cs2.R << ")" << endl;
    cout << "cr1([" << cr1.P.X << ", " << cr1.P.Y << "], " << cr1.R << ")" << endl;
    cout << "cr2([" << cr2.P.X << ", " << cr2.P.Y << "], " << cr2.R << ")" << endl;
    char ch;
    cin >> ch;
    return 0;
}

当您在类中定义operator-这样的操作符作为成员函数时,那么当您使用它时

C3 = C1 + C2;

编译器实际上正在调用你的成员函数,比如

C3 = C1.operator+(C2);

从这里你应该可以看出作为成员函数的操作符只接受一个参数,并且操作符中的第一个对象是this对象。

对于独立(非成员)函数,它们需要两个实参。


你可能想检查一下,比如这个关于操作符重载的引用

有不正确的重载操作符。请看下面的代码:

Circle operator +(const Circle& C)
{
    return Circle(this->P, this->R + C.R);
}
Circle operator -(const Circle& C)
{
    return Circle(this->P, this->R - C.R);
}