C++关于继承问题,跪求高手解答
把定义平面直角坐标系上的一个点的类cpoint作为基类,派生出描述一条直线的类cline,再派生出一个矩形类crect。要求成员函数能求出两点间距,矩形周长和面积。程序比...
把定义平面直角坐标系上的一个点的类cpoint作为基类,派生出描述一条直线的类cline,再派生出一个矩形类crect。要求成员函数能求出两点间距,矩形周长和面积。
程序比较复杂,但是我看了好几天还是不知道错在哪?有劳各位高手不吝赐教,多谢!
#include<iostream>
#include<cmath>
using namespace std;
class cpoint
{
public:
int x,y;
public:
cpoint(int x=0,int y=0)
{
this->x=x;
this->y=y;
}
};
class cline:public cpoint
{
private:
cpoint p1,p2;
public:
cline(int a,int b,int c,int d)
:p1(a,b),p2(c,d)
{}
double length()//求两点间距
{
return sqrt((p2.y-p1.y)*(p2.y-p1.y)+(p2.x-p1.x)*(p2.x-p1.x));
}
};
class crect:public cline
{
private:
cline l1,l2;
public:
crect(int a,int b,int c,int d,int e,int f)
:
l1(a,b,c,d),l2(c,d,e,f)
{}
void girth()
{
cout<<"周长:"<<2*(l1.length()+l2.length()) <<endl;
}
void area()
{
cout<<"面积:"<<l1.length()*l2.length()<<endl;
}
};
int main()
{
crect c(0,0,1,0,1,1);
c.girth();
c.area();
return 0;
} 展开
程序比较复杂,但是我看了好几天还是不知道错在哪?有劳各位高手不吝赐教,多谢!
#include<iostream>
#include<cmath>
using namespace std;
class cpoint
{
public:
int x,y;
public:
cpoint(int x=0,int y=0)
{
this->x=x;
this->y=y;
}
};
class cline:public cpoint
{
private:
cpoint p1,p2;
public:
cline(int a,int b,int c,int d)
:p1(a,b),p2(c,d)
{}
double length()//求两点间距
{
return sqrt((p2.y-p1.y)*(p2.y-p1.y)+(p2.x-p1.x)*(p2.x-p1.x));
}
};
class crect:public cline
{
private:
cline l1,l2;
public:
crect(int a,int b,int c,int d,int e,int f)
:
l1(a,b,c,d),l2(c,d,e,f)
{}
void girth()
{
cout<<"周长:"<<2*(l1.length()+l2.length()) <<endl;
}
void area()
{
cout<<"面积:"<<l1.length()*l2.length()<<endl;
}
};
int main()
{
crect c(0,0,1,0,1,1);
c.girth();
c.area();
return 0;
} 展开
展开全部
错误的根源在于CLIEN没有默认的构造函数。
crect(int a,int b,int c,int d,int e,int f):l1(a,b,c,d),l2(c,d,e,f)这样的赋值方式是错误的。要实现这样的赋值方式,必须保证基类有默认的构造函数
你在cline中能这么用,是因为CPOINT类有一个默认的构造函数。
cpoint(int x=0,int y=0)
{
this->x=x;
this->y=y;
}
如果改为
cpoint(int x,int y)
{
this->x=x;
this->y=y;
}
同样会报错。
crect(int a,int b,int c,int d,int e,int f):l1(a,b,c,d),l2(c,d,e,f)这样的赋值方式是错误的。要实现这样的赋值方式,必须保证基类有默认的构造函数
你在cline中能这么用,是因为CPOINT类有一个默认的构造函数。
cpoint(int x=0,int y=0)
{
this->x=x;
this->y=y;
}
如果改为
cpoint(int x,int y)
{
this->x=x;
this->y=y;
}
同样会报错。
展开全部
class cline:public cpoint
{
private:
cpoint p1,p2;
public:
cline(){}
cline(int a,int b,int c,int d)
:p1(a,b),p2(c,d)
{}
没有可用的默认构造函数,导致出错
{
private:
cpoint p1,p2;
public:
cline(){}
cline(int a,int b,int c,int d)
:p1(a,b),p2(c,d)
{}
没有可用的默认构造函数,导致出错
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
为Cline定义一个带有默认参数的构造函数即可,完整源代码如下,vc6.0测试通过。
#include<iostream>
#include<cmath>
using namespace std;
class cpoint
{
public:
int x,y;
public:
cpoint(int x=0,int y=0)
{
this->x=x;
this->y=y;
}
};
class cline:public cpoint
{
private:
cpoint p1,p2;
public:
cline(int a = 0,int b = 0,int c = 0,int d = 0)
:p1(a,b),p2(c,d)
{}
double length()//求两点间距
{
return sqrt((p2.y-p1.y)*(p2.y-p1.y)+(p2.x-p1.x)*(p2.x-p1.x));
}
};
class crect:public cline
{
private:
cline l1,l2;
public:
crect(int a,int b,int c,int d,int e,int f)
:
l1(a,b,c,d),l2(c,d,e,f)
{}
void girth()
{
cout<<"周长:"<<2*(l1.length()+l2.length()) <<endl;
}
void area()
{
cout<<"面积:"<<l1.length()*l2.length()<<endl;
}
};
int main()
{
crect c(0,0,1,0,1,1);
c.girth();
c.area();
return 0;
}
#include<iostream>
#include<cmath>
using namespace std;
class cpoint
{
public:
int x,y;
public:
cpoint(int x=0,int y=0)
{
this->x=x;
this->y=y;
}
};
class cline:public cpoint
{
private:
cpoint p1,p2;
public:
cline(int a = 0,int b = 0,int c = 0,int d = 0)
:p1(a,b),p2(c,d)
{}
double length()//求两点间距
{
return sqrt((p2.y-p1.y)*(p2.y-p1.y)+(p2.x-p1.x)*(p2.x-p1.x));
}
};
class crect:public cline
{
private:
cline l1,l2;
public:
crect(int a,int b,int c,int d,int e,int f)
:
l1(a,b,c,d),l2(c,d,e,f)
{}
void girth()
{
cout<<"周长:"<<2*(l1.length()+l2.length()) <<endl;
}
void area()
{
cout<<"面积:"<<l1.length()*l2.length()<<endl;
}
};
int main()
{
crect c(0,0,1,0,1,1);
c.girth();
c.area();
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在cline类中,cpoint p1,p2需要调用cpoint的默认构造函数cpoint(),而你在cpoint中定义了自己的构造函数导致该默认构造函数失效,所以你需要在cpoint中补上该默认构造函数,而crect中cline同理也是。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询