-3
 //main()
  #include <iostream>
 #include "Circle.h"
 #define PI 3.1415965 //defining the pi number

 using namespace std;         //I want to create a class that has the characteristics of a circle

  int main()
 {
    Circle c1(1);   //making a class object
     cout<<c1;      //using the operator<< after overloading it 

       return 0;
 }

   //circle.h
  #include <iostream>          //I'm just practicing with these things so my code will probably have some mistakes but I really cannot understand where is the right place for the operator<< because I receive errors all the time
  using namespace std;


      class Circle    //creating the class circle
{
        public:
          Circle();                //constructor with zero members
          Circle(float r);         //constructor with one member
          float getPerimetre();      //getting the perimeter of the circle
          float getArea();          //getting the area of the circle
          friend ostream &operator<<(ostream &mystream, Circle &p);   //making the operator<<

        private:
          float radius;  //private members
};


     #endif // CIRCLE_H

     //circle.cpp
      #include "Circle.h"
     #include <iostream>
     #define PI 3.14159265   //defining the pi number

     using namespace std;

      Circle::Circle()    //creating the constructor with zero members
     {
         radius=0;   

     Circle::Circle(float r)    //creating the constructor with one member
     {
         radius=r;
      }
     float Circle::getPerimetre()    //explaining the functions  get perimetre
     {
         return (2*PI*radius);
      }
     float Circle::getArea()  //and get area
      {
          return (PI*radius*radius);
      }
      ostream &operator<<(ostream &mystream, Circle &p)  //i'm not sure if this is the right place to write this
      {
            mystream<<radius<<", "<<getPerimetre()<<", "<<getArea()<<endl;
            return mystream;
      }

out from all the things that I've read I really cannot understand where is the correct spot to write this operator and why I keep receiving errors when I run the project. I am new to this and also to this site so any help would be very apreciated

Lightness Races in Orbit
  • 378,754
  • 76
  • 643
  • 1,055
loukous
  • 15
  • 1
  • 9

2 Answers2

0
      friend ostream &operator<<(ostream &mystream, Circle &p);   

should be

      friend ostream &operator<<(ostream &mystream, const Circle &p);   

and the implementation should look like

  ostream &operator<<(ostream &mystream, const Circle &p)
  {
        mystream<<p.radius<<", "<<p.getPerimetre()<<", "<<p.getArea()<<endl;
        return mystream;
  }

this also requires that you classify getPerimetre() and getArea() as const functions in your class declaration

 class Circle {
    public:
      // ...
      float getPerimetre() const;
                        // ^^^^^
      float getArea() const;
                   // ^^^^^
      // ...
 };

and definition

 float Circle::getPerimetre()  const {
                            // ^^^^^

     return (2*PI*radius);
  }
 float Circle::getArea() const {
                      // ^^^^^
      return (PI*radius*radius);
  }
πάντα ῥεῖ
  • 1
  • 13
  • 116
  • 190
0

Your operator<< is at good place, however since it isn't member function you can't access members without object:

p.radius instead of radius

p.getPerimetre() instead of getPerimetre()

p.getArea() instead of getArea()

ostream &operator<<(ostream &mystream, Circle &p)  //i'm not sure if this is the right place to write this
          {
                mystream<<radius<<", "<<p.getPerimetre()<<", "<<p.getArea()<<endl;
                return mystream;
          }
PcAF
  • 1,975
  • 12
  • 20