/*************************************************
此文件包含各种复杂指针用法的区分:
指针数组
数组指针
指针函数
函数指针
指向指针的指针
vector<Line*>类型转换成vector<Point*>类型
vector<Point*>型转换成vector<Line*>类型
注意:这里是Point*类型转换成Line*类型
/*************************************************/
#include <iostream>
#include <vector>
using namespace std;
//const int n=3;
//int *p();
//int (*p)();
int *fun(int* x)
{
(*x)++;
return x;
}
int funy(int& y)
{
y++;
return y;
}
class Point
{
private:
int _x;
int _y;
public:
Point(int x,int y)
{
_x=x;
_y=y;
}
//定义拷贝构造函数
Point(Point& pt):_x(pt._x),_y(pt._y){}
Point(){_x=0;_y=0;}
~Point(){}
int GetX(){return _x;}
int GetY(){return _y;}
Point& operator+(Point& pt)
{
Point temp;
temp._x=_x+pt._x;
temp._y=_y+pt._y;
return temp;
}
Point& operator-(Point& pt)
{
Point temp;
temp._x=this->_x-pt._x;
temp._y=this->_y-pt._y;
return temp;
}
virtual Point& GetPoint1(){}
virtual Point& GetPoint2(){}
/*Point operator=(Point& pt)
{
_x=pt._x;
_y=pt._y;
return *this;
}*/
};
class Line:public Point
{
private:
Point _point1;
Point _point2;
public:
//不带参的构造函数
Line()
{
_point1=Point(0,0);
_point2=Point(1,1);
}
//带参的构造函数
Line(Point& p1,Point& p2)
{
_point1=p1;
_point2=p2;
}
//拷贝构造函数
Line(Line& line);
//计算两点间的距离
float Distance(Point& p1,Point& p2) const;
Point& GetPoint1()
{
return _point1;
}
Point& GetPoint2()
{
return _point2;
}
};
Line::Line(Line& line)
{
this->_point1=line._point1;
this->_point2=line._point2;
}
float Line::Distance(Point& p1,Point& p2) const
{
}
int main()
{
//线段调用默认构造函数
Line line1; //(0,0)---->(1,1)
Point pt1(3,3);
Point pt2(5,5);
Point pt3(pt1);
Point pt4=pt1+pt2;
Point pt5=pt2-pt1;
Line line2(pt1,pt2);
//Line line3(pt4,pt5);
cout<<"("<<pt1.GetX()<<","<<pt1.GetY()<<")"<<endl;
cout<<"("<<pt4.GetX()<<","<<pt4.GetY()<<")"<<endl;
cout<<"("<<pt5.GetX()<<","<<pt5.GetY()<<")"<<endl;
Point pt6=line1.GetPoint1();
Point pt7=line1.GetPoint2();
/*cout<<"线段1的起始点跟终止点是:"<<endl;
cout<<"("<<pt6.GetX()<<","<<pt6.GetY()<<")"<<endl;
cout<<"("<<pt7.GetX()<<","<<pt7.GetY()<<")"<<endl;
Point pt8=line2.GetPoint1();
Point pt9=line2.GetPoint2();
cout<<"线段2的起始点跟终止点是:"<<endl;
cout<<"("<<pt8.GetX()<<","<<pt8.GetY()<<")"<<endl;
cout<<"("<<pt9.GetX()<<","<<pt9.GetY()<<")"<<endl;*/
//将vector<Line*>类型转换成vector<Point*>类型
vector<Line*> line;
vector<Point*> point;
point.push_back(&line1); //上行转换
point.push_back(&line2);
for(int i=0;i<point.size();i++)
{
Point ptemp1=point[i]->GetPoint1();
Point ptemp2=point[i]->GetPoint2();
cout<<"线段"<<i+1<<"的起始点跟终止点是:"<<endl;
cout<<"("<<ptemp1.GetX()<<","<<ptemp1.GetY()<<")"<<endl;
cout<<"("<<ptemp2.GetX()<<","<<ptemp2.GetY()<<")"<<endl;
}
line.push_back((Line*) &pt1); //下行转换,不安全???
line.push_back((Line*) &pt2);
for(int i=0;i<line.size();i++)
{
cout<<"pt"<<i+1<<"坐标为:"<<endl;
cout<<"("<<line[i]->GetX()<<","<<line[i]->GetY()<<")"<<endl;
}
//指针数组
int *p[4];
int a[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
for(int i=0;i<4;i++)
p[i]=a[i];
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
cout<<*(p[i]+j)<<" ";
cout<<endl;
//数组指针
int (*pvar)[4];
pvar=a;
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
cout<<*(*(pvar+i)+j)<<" ";
cout<<endl;
//指针函数
int b=1;
cout<<*fun(&b)<<endl;
//函数指针
int c=2;
int (*pfun)(int& x);
pfun=funy;
cout<<(*pfun)(c)<<endl;
//p=a;
//for(int i=0;i<4;i++)
// for(int j=0;j<4;j++)
// cout<<*(*(p+i)+j)<<" ";
//int (*p)[n];
return 0;
}