测试的正确格式代码:
#include <iostream>
using namespace std;
//定义一个圆类和点类,判断点与圆的内部还是外部等
//设计一个点类
class Point{//前置声明仍然报错,只有把这个类放Circle类的前面了
public:
void setPoint(int _x,int _y){
x = _x;
y = _y;
}
int getX(){
return x;
}
int getY(){
return y;
}
private:
int x;
int y;
};
//设计一个圆类
class Circle{
public:void setCircle(int _r,int _x0,int _y0){
r = _r;
x0 = _x0;
y0 = _y0;
}
int judgePoint(Point &p1){
int tem = (p1.getX()-x0)*(p1.getX()-x0)+(p1.getY()-y0)*(p1.getY()-y0)-r*r;
if(tem > 0){
return 1;
}
else if(tem == 0){
return 0;
}
else{
return -1;
}
}
private:
int r;
int x0;
int y0;
};
int main()
{
Circle c1;
Point p;
c1.setCircle(2,3,3);
p.setPoint(6,6);
if(c1.judgePoint(p)==0){
cout <<"点在园上"<<endl;
}
else if(c1.judgePoint(p)==-1){
cout <<"点在园内"<<endl;
}
else{
cout <<"点在圆外"<<endl;
}
return 0;
}
相同代码不同顺序报错(Point类定义在Circle类的后面)
#include <iostream>
using namespace std;
//定义一个圆类和点类,判断点与圆的内部还是外部等
class Point;//类的前置声明,因为Circle类用到了Point类,所以要么把Point类放Circle类前面定义,要么就声明一下
//设计一个圆类
class Circle{
public:void setCircle(int _r,int _x0,int _y0){
r = _r;
x0 = _x0;
y0 = _y0;
}
int judgePoint(Point &p1){
int tem = (p1.getX()-x0)*(p1.getX()-x0)+(p1.getY()-y0)*(p1.getY()-y0)-r*r;
if(tem > 0){
return 1;
}
else if(tem == 0){
return 0;
}
else{
return -1;
}
}
private:
int r;
int x0;
int y0;
};
//设计一个点类
class Point{//前置声明仍然报错,只有把这个类放Circle类的前面了
public:
void setPoint(int _x,int _y){
x = _x;
y = _y;
}
int getX(){
return x;
}
int getY(){
return y;
}
private:
int x;
int y;
};
int main()
{
Circle c1;
Point p;
c1.setCircle(2,3,3);
p.setPoint(6,6);
if(c1.judgePoint(p)==0){
cout <<"点在园上"<<endl;
}
else if(c1.judgePoint(p)==-1){
cout <<"点在园内"<<endl;
}
else{
cout <<"点在圆外"<<endl;
}
return 0;
}
问题:为何不能像Java那样,同一个文件内定义多个类,可以不分先后顺序直接调用?是编译器该优化还是专门这么设计的?还是什么?(当然,这只是一个小demo,在正式的企业开发中是不会这么定义,而是声明和实现分开,最后统一include一下再调用)