为什么我的代码不起作用? c ++运算符

时间:2016-05-22 13:18:57

标签: c++ operator-overloading

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

从我读过的所有内容中我真的无法理解编写此运算符的正确位置以及为什么我在运行项目时不断收到错误。我是新手,也是这个网站,所以任何帮助都会非常苛刻

2 个答案:

答案 0 :(得分:0)

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

应该是

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

并且实现应该看起来像

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

这还要求您将getPerimetre()getArea()分类为类声明中的const函数

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

和定义

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

     return (2*PI*radius);
  }
 float Circle::getArea() const {
                      // ^^^^^
      return (PI*radius*radius);
  }

答案 1 :(得分:0)

您的operator<<处于合适的位置,但由于不是会员功能,您无法访问没有对象的成员

p.radius代替radius

p.getPerimetre()代替getPerimetre()

p.getArea()代替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;
          }