Ошибка: тип возврата 'класс Polar' является неполным, недопустимое использование типа 'полярный' - PullRequest
0 голосов
/ 11 февраля 2019

Я хотел использовать оператор приведения для приведения класса 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;
  }

Есть ли способ использовать объект класса Polar внутри класса Rect.Если нет, то как указатели могут использоваться для приведения.

1 Ответ

0 голосов
/ 11 февраля 2019

Нет, вы не можете использовать что-либо, что зависит от определения 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));
}

И, кстати, этот оператор преобразование оператор.Приведение - это один из способов запросить преобразование, но это не единственный способ.

Да, также operator Polar() должно быть const, поскольку он не изменяет объект, к которому он применяется.Так operator Polar() const; в определении Rect и inline Rect::operator Polar() const { ... } в определении.

...