I am trying to finish it but there is a problem. The overloaded operator>> doesn’t work in class Circle. Would you please explain to me what wrong thing I did? Thank you so much.

``````#include <iostream>
using std::cout;
using std::cin;
using std::endl;
using std::istream;
using std::ostream;
#include <iomanip>
using std::setw;

////////////////// POINT ////////////////////////////////
class Point
{
friend ostream &operator<<(ostream &out, const Point &right);
friend istream &operator>>(istream &in, Point &right);
public:
Point(double a = 0, double b = 0);
virtual ~Point(){};
void setPoint(double a, double b);
private:
double x;
double y;
};

Point::Point(double a, double b) : x(a), y(b)
{}

void Point::setPoint(double a, double b)
{	x = a;	y = b;	}

ostream &operator<<(ostream &out, const Point &right)
{

out << '(' << right.x << ',' << right.y << ')';
out << endl;
return out;
}

istream &operator>>(istream &in, Point &right)
{
int a, b;
in >> a;
in >> b;
right.setPoint(a, b);
return in;
}

////////////////// CIRCLE ////////////////////////////////
class Circle : public Point
{
friend ostream &operator<<(ostream &out, const Circle &right);
friend istream &operator>>(istream &in, Circle &right);
public:
Circle(double a = 0, double b = 0, double r = 0);
virtual ~Circle(){};
void setCircle(double r);
double getArea() const;
private:
};

Circle::Circle(double a, double b, double r) : Point(a, b)
{	setCircle(r);	}

void Circle::setCircle(double r)

double Circle::getArea() const

ostream &operator<<(ostream &out, const Circle &right)
{
out << "Center: ";
out << Point(right);
out << "Area: " << right.getArea() << endl;
return out;
}

istream &operator>>(istream &in, Circle &right)
{
cout << "Enter the center of circle: " << endl;
in >> static_cast<Point>(right); // HERE. It doesn't work //
return in;
}

void main()
{
Circle c;

cin >> c;
cout << c;

cout << endl;
}``````

## All 2 Replies

Are you sure that's the class heiarchy you want? If it were me I'd declare Circle to have a member variable of type Point, since a Circle is not a Point like every Dog is an Animal and every Car is a Vehicle.

What's a problem? At first sight, it works...

Some remarks:
1. You have Point class. Where is natural constructor `Circle(const Point&,double radius)` ?
2. It's doubtful style to define overloaded >> op with interactive output. Better define special member function (enterPoint, enterCircle or what else). Good stream input operator must read a result of correspondent output op - that's all.