错误:返回类型“ Polar”的类型不完整,无效使用了“ Polar”类型

时间:2019-02-11 16:25:10

标签: c++ incomplete-type

我想使用类型转换运算符将Rect类转换为Polar类, 但是我收到错误消息,指出“类型不完整”。我什么都没有 使用指针而不是对象本身时出错。但是我不能回来 指向用于铸造目的的对象的指针。

#include<iostream>
#include<cmath>
using namespace std;
class Polar;
class Rect{
    double x;
    double y;
    public:
        Rect(double xx, double yy): x(xx), y(yy) {}
        void display(void){
            cout<<x<<endl;
            cout<<y<<endl;
        }
        operator Polar(){//need help regarding this function
            return Polar(sqrt(x*x + y*y) , atan(y/x)*(180/3.141));
        }
};
class Polar{
    double r;
    double a;
    double x;
    double y;
    public:
        Polar(double rr, double aa){
            r=rr;
            a=aa*(3.141/180);
            x= r* cos(a);
            y= r* sin(a);
        }
        Polar(){
            r=0;
            a=0;
            x=0;
            y=0;
        }
        Polar operator+(Polar right){
            Polar temp;
            //addition 
            temp.x= x+ right.x;
            temp.y= x+ right.y;
            //conversion
            temp.r= sqrt(temp.x*temp.x + temp.y*temp.y);
            temp.a= atan(temp.y/temp.x)*(180/3.141);
            return temp;
        }
        operator Rect(){
            return Rect(x,y);
        }
        friend ostream & operator <<(ostream &out, Polar a);
        double getr(){
            return r;
        }
        double geta(){
            return a;
        }
 };
 ostream & operator <<(ostream &out,Polar a){
    out<<a.getr()<<", "<<a.geta()<<endl;
    return out;
}
int main()
{
    Polar a(10.0, 45.0);
    Polar b(8.0, 45.0);
    Polar result;
    //+ operator overloading
    result= a+b;
    //<< overloading
    cout<<result<<endl;

    Rect r(18,45);
    Polar p(0.2,53);
    r=p;//polar to rect conversion
    r.display();
    return 0;
  }

有没有一种方法可以在Rect类中使用Polar类的对象。如果 那么如何才能将指针用于强制转换的目的。

1 个答案:

答案 0 :(得分:3)

否,您不能使用取决于Polar 内部 Rect的定义的任何内容。 Polar尚未定义。而是将operator Polar() { ... }更改为声明operator Polar();,并将其定义放在Polar之后:

inline Rect::operator Polar() {
    return Polar(sqrt(x*x + y*y) , atan(y/x)*(180/3.141));
}

顺便说一句,该运算符是 conversion 运算符。强制转换是要求转换的一种方法,但这不是唯一的方法。

哦,operator Polar()也应该是const,因为它不会修改应用于该对象的对象。因此,operator Polar() const;的定义为Rect,定义为inline Rect::operator Polar() const { ... }