在类外定义重载的outstream运算符

时间:2014-08-23 20:44:31

标签: c++

这是我编写的一些简单代码。它只是复制一个对象并使用重载运算符显示它的数据函数。

      //Base
      #include<iostream>
      #include<istream>
      #include<ostream>
      using std::ostream;
      using std::istream;
      using namespace std;

      class Sphere{
      public: 

      Sphere(double Rad = 0.00, double Pi = 3.141592);


      ~Sphere();




    Sphere(const Sphere& cSphere)

    //overloaded output operator
    friend ostream& operator<<(ostream& out, Sphere &fSphere);


    //member function prototypes
    double Volume();
    double SurfaceArea();
    double Circumference();

protected:
    double dRad;
    double dPi;
};


//defining the overloaded ostream operator
ostream& operator<<(ostream& out, Sphere& fSphere){
    out << "Volume: " << fSphere.Volume() << '\n'
        << "Surface Area: " << fSphere.SurfaceArea() << '\n'
        << "Circumference: " << fSphere.Circumference() << endl;
    return out;
    }

成员函数在.cpp文件中定义。问题是当我编译这个程序时,我被告知

 there are multiple definitions of operator<<(ostream& out, Sphere& fSphere)

这很奇怪,因为outstream运算符是非成员函数,所以它应该能够在类之外定义。然而,当我在类中定义此运算符时,该程序运行良好。怎么回事?

2 个答案:

答案 0 :(得分:4)

您似乎在头文件中定义了运算符,并在多个cpp模块中包含此标头。或者在其他cpp模块中包含一个带有函数定义的cpp模块。 通常,错误消息显示函数多重定义的位置。因此,重新读取错误消息的所有行

考虑到将运营商声明为

会更好
ostream& operator<<(ostream& out, const Sphere &fSphere);

答案 1 :(得分:2)

看起来像头文件所呈现的代码。它包含operator<<定义,因此任何包含您的标题的文件都有自己的定义副本,因此&#34;多个定义&#34;错误。将关键字inline添加到您的函数,或将该函数移动到.cpp文件。