重载cout时未定义的引用

时间:2013-11-23 10:31:10

标签: c++ dev-c++

我使用dev c ++定义了一个点类。然后我试图为这个类重载cout。 虽然不使用它我没有错误。但是当我在main中使用它时它会给我这个错误:

[Linker error] C:\Users\Mohammad\Desktop\AP-New folder\point/main.cpp:12: undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, Point const&)' 

// point.h

    class Point{
private:
    double x;
    double y;
    double z;
public:

    //constructors:
    Point()
    {
    x=0;
    y=0;
    z=0;
    }
    Point(double xx,double yy,double zz){x=xx; y=yy; z=zz;}

    //get:
    double get_x(){return x;}
    double get_y(){return y;}       
    double get_z(){return z;}

    //set:
    void set_point(double xx, double yy, double zz){x=xx; y=yy; z=zz;}

    friend ostream &operator<<(ostream&,Point&);

};

    //point.cpp
    ostream &operator<<(ostream &out,Point &p){
        out<<"("<<p.x<<", "<<p.y<<", "<<p.z<<")\n";
        return out;

}

// main.cpp中

    #include <iostream>
    #include "point.h"

    using namespace std;

    int main(){

Point O;
cout<<"O"<<O;


cin.get();
return 0;

}

1 个答案:

答案 0 :(得分:2)

这是因为您在声明和定义运营商时未将Point设为const。更改您的声明如下:

friend ostream &operator<<(ostream&, const Point&);

还在定义中添加const

ostream &operator<<(ostream &out, const Point &p){
    out<<"("<<p.x<<", "<<p.y<<", "<<p.z<<")\n";
    return out;
}

请注意,您发布的代码不需要const - Point&。其他一些代码使您的编译器或IDE认为引用了const的运算符。例如,使用这样的运算符需要const

cout << Point(1.2, 3.4, 5.6) << endl;

(demo)

由于上面的代码片段创建了一个临时对象,因此C ++标准禁止将其作为非const引用传递给它。

与此问题没有直接关系,但您可能还希望为个别坐标const标记三个getter:

double get_x() const {return x;}
double get_y() const {return y;}       
double get_z() const {return z;}

这将允许您访问标记为const的对象上的getter坐标。