做一个很简单的C++ 实验,竟然报错
以下为程序代码,写一个圆类,实现运算符重载。
头文件:Circle.h
#ifndef CIRCLE_H
#define CIRCLE_H
class Circle
{
public:
Circle():PI(3.14) {}
Circle(double radius):PI(3.14)
{
this->radius=radius;
}
double getRadius()
{
return radius;
}
void setRadius(double radius)
{
this->radius=radius;
}
double getArea() const
{
return PI*radius*radius;
}
bool operator<(const Circle& c);
bool operator<=(const Circle& c);
bool operator==(const Circle& c);
bool operator!=(const Circle& c);
bool operator>(const Circle& c);
bool operator>=(const Circle& c);
void operator=(const Circle& c)
{
radius=c.getRadius();
}
private:
double radius;
const double PI;
};
#endif
实现文件 Circle.cpp
#include"Circle.h"
bool Circle::operator<(const Circle& c)
{
return radius<c.getRadius();
}
bool Circle::operator<=(const Circle& c)
{
return radius<=c.getRadius();
}
bool Circle::operator==(const Circle& c)
{
return radius==c.getRadius();
}
bool Circle::operator!=(const Circle& c)
{
return radius!=c.getRadius();
}
bool Circle::operator>(const Circle& c)
{
return radius>c.getRadius();
}
bool Circle::operator>=(const Circle& c)
{
return radius>=c.getRadius();
}
测试文件main.cpp
#include"Circle.h"
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
int main()
{
vector<Circle> vec;
int n,i;
cout<<"Please input the number of circles:"<<endl;
cin>>n;
cout<<"Please input the radius of circles(eg.1 2 3 4 5 6...):"<<endl;
for(i=0;i<n;++i)
{
double r;
cin>>r;
vec.push_back(Circle(r));
}
sort(vec.begin(),vec.end());
cout<<"after sorted:"<<endl;
for(i=0;i<vec.size();++i)
cout<<"Circle("<<vec[i].getRadius()<<')'<<' ';
cout<<endl;
return 0;
}
在VC6下测试,报以下错误
无奈之下,百度之,得知问题根源在于头文件的get函数
double getRadius()
{
return radius;
}
由于Circle.cpp文件中实现运算符重载的函数中形式参数为const Circle&类型,const对象在调用成员函数时,会将this指针强制转换成const this指针,本例中,形式参数中的c对象会找成员函数中对应的const类型 getRadius函数,而编译器无法将非const类型的getRadius函数转换成const类型的getRadius函数,因此出现编译错误。
解决方法:
将getRadius成员函数改为
double getRadius() const
{
return radius;
}
即可,或将Circle.cpp文件中的形式参数改为Circle& c。