【问题标题】:C++ another class member and overloading operatorC++ 另一个类成员和重载运算符
【发布时间】:2014-08-30 11:39:07
【问题描述】:

我需要编写如下程序:

#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 的成员为中心,两个运算符相加和减去两个 Circles。

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

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

编辑: 更正后它看起来像这样,并且可以完美运行:

#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;
}

【问题讨论】:

  • 错误是什么?错误对于帮助找出问题所在非常重要。经验丰富的程序员通常可以仅从错误中找出错误。
  • 你有(至少)一个错误:不是C1.Point,而是operator+中的C1.Poperator-中的C2也是如此)
  • 您知道,您的 op+ / op- 过载违反了最小惊讶规则。请阅读:Operator overloading
  • 我希望...我不知道,也许是工会?

标签: c++ class member


【解决方案1】:

您有不正确的重载运算符。看下面的代码:

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);
}

【讨论】:

    【解决方案2】:

    当你在你的类中定义像operator-这样的操作符作为成员函数,然后当你使用它时

    C3 = C1 + C2;
    

    编译器实际上是在调用你的成员函数

    C3 = C1.operator+(C2);
    

    由此你应该可以看出,作为成员函数的运算符只需要一个参数,而运算符中的第一个对象是this对象。

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


    您可能想检查一下,例如this reference on operator overloading.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多