1. 实现二维坐标下的类,点Point和圆Circle
用横纵坐标确定一个点,用一个点和一个半径确定一个圆
#include <iostream>
using namespace std;
class Point{
protected:
int x;
int y;
public:
Point(int x,int y):x(x),y(y){
}
int GetX() const {
return x;} // 获取x
int GetY() const {
return y;} // 获取y
friend ostream& operator << (ostream& os,const Point& p){
// <<运算符重载
return os << "(" << p.x << "," << p.y << ")";
}
};
/*
ostream& operator << (ostream& os,const Point& p){
return os << "(" << p.GetX() << "," << p.GetY() << ")";
}
*/
class Circle:public Point{
int r;
public:
Circle(int x,int y,int r):Point(x,y),r(r){
}
int GetR() const {
return r;} // 获取半径
Point GetCenter() const {
return Point(x,y);} // 获取圆心
friend ostream& operator << (ostream& os,const Circle& p){
return os << "(" << p.x << "," << p.y << "," << p.r << ")";
}
};
int main(){
Point p(2,3);
cout << p << endl;
Circle c(1,2,5);
cout << c << endl;
}
结果为:
(2,3)
(1,2,5)
继承:A is a B
Circle is a Point ??? NO
组合:A has a B
Circle has a Point ??? YES
按照正确的逻辑,应该使用组合而非继承
#include <iostream>
using namespace std;
class Point{
protected:
int x;
int y;
public:
Point(int x,int y):x(x),y(y){
}
int GetX() const {
return x;}
int GetY() const {
return y;}
friend ostream& operator << (ostream& os,const Point& p){
return os << "(" << p.x << "," << p.y << ")";
}
};
class Circle /*:public Point*/{
int r;
Point center;
public:
Circle(int x,int y,int r):center(x,y),r(r){
}
int GetR() const {
return r;}
Point GetCenter() const {
return center;}
friend ostream& operator << (ostream& os,const Circle& p){
return os << "(" << p.center.GetX() << "," << p.center.GetY() << "," << p.r << ")";
}
};
int main(){
Point p(2,3);
cout << p << endl;
Circle c(1,2,5);
cout << c << endl;
}
2. 实现二维坐标下的类,线Line和三角形Triangle
用两个点确定一条线,用三个点确定一个三角形
#include <iostream>
#include <cmath>
using namespace std;
class Point{
protected:
int x;
int y;
public:
Point(int x,int y):x(x),y(y){
}
int GetX() const {
return x;}
int GetY() const {
return y;}
friend ostream& operator << (ostream& os,const Point& p){
return os << "(" << p.x << "," << p.y << ")";
}
};
class Line {
Point a;
Point b;
public:
Line(const Point& a,const Point& b):a(a),b(b){
}
float GetLength() const{
// 计算线段的长度
int w = a.GetX()-b.GetX();
int h = a.GetY()-b.GetY();
return sqrt(w*w+h*h);
}
friend ostream& operator << (ostream& os,const Line& line){
// 打印线段两点
return os << line.a << "~" << line.b;
}
};
class Triangle{
Point a;
Point b;
Point c;
public:
Triangle(const Point& a,const Point& b,const Point& c):a(a),b(b),c(c){
}
float GetLength() const{
// 计算三角形周长
return Line(a,b).GetLength() + Line(a,c).GetLength() + Line(b,c).GetLength();
}
friend ostream& operator << (ostream& os,const Triangle& t){
// 打印三角形三点
return os << "[" << t.a << "," << t.b << "," << t.c << "]";
}
};
int main(){
Point p(4,3); // 点(4,3)
cout << p << endl;
Point o(0,0);
Line line(p,o); // 直线(4,3)~(0,0)
cout << line << " " << line.GetLength() << endl;
Triangle t(p,o,Point(1,-1));