我使用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;
}
答案 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;
由于上面的代码片段创建了一个临时对象,因此C ++标准禁止将其作为非const引用传递给它。
与此问题没有直接关系,但您可能还希望为个别坐标const
标记三个getter:
double get_x() const {return x;}
double get_y() const {return y;}
double get_z() const {return z;}
这将允许您访问标记为const
的对象上的getter坐标。