设计一个描述儿童、成人和老人的类,儿童分为学龄前和学龄期儿童,成人有工作,老人已退休。提取共性作为基类,并派生出满足要求的各个类及每一个类上的操作。设计一个完整的程序,并完成测试程序的正确性。
#include "stdafx.h"
#include <iostream.h>
#include <string.h>
class Base{
char *Name; //姓名
int Year,Month,Day; //分别存放出生年、月、日
char *BothPlace; //出生地
public:
Base( char *n, int y,int m,int d,char *bp)
{
strcpy(Name,n);
Year=y;
Month=m;
Day=d;
strcpy(BothPlace,bp);
}
Base(){}
void SetDate(int y,int m,int n) //设置出生年、月、日
{
Year=y;
Month=m;
Day=n;
}
void SetName(char *n) //设置姓名
{
strcpy(Name,n);
}
void SetBothPlace(char *bp) //设置出生地
{
strcpy(BothPlace,bp);
}
void GetDate(int *y,int *m ,int *d) //获取出生年、月、日
{
Year=*y;
Month=*m;
Day=*d;
}
void GetName(char *m) //获取姓名
{
Name=new char[10];
Name=m;
}
void GetBothPlace(char *bp) //获取出生地
{
BothPlace=new char[20];
BothPlace=bp;
}
void PrintBase() //输出有关信息
{
cout<<*Name;
cout<<Year<<Month<<Day;
cout<<*BothPlace;
}
};
class AllChil:public Base
{
char *ParMa; //监护人
public :
AllChil() :Base(){}
AllChil(char *n, int y,int m,int d,char *bp,char *pm):Base(n,y,m,d,bp)
{
strcpy(ParMa,pm);
}
void SetParMa( char *pm) //设置监护人
{
strcpy(ParMa,pm);
}
void GetParMa( char *pm) //获取监护人
{
ParMa=new char[20];
ParMa=pm;
}
void PrintAllChil( ) //输出有关信息
{
PrintBase();
cout<<*ParMa;
}
};
class Men:public Base
{
char *unit; //单位
int salary; //工资
char *tel; //电话
public:
Men( ) :Base(){}
Men(char *n, int y,int m,int d,char *bp,char *u,int s,char *te):Base(n,y,m,d,bp)
{
strcpy(unit,u);
salary=s;
strcpy(tel,te);
}
void GetData(char *u,int *s,char *te) //取单位,工资,电话
{
unit=new char[15];
unit=u;
salary=*s;
tel=new char[10];
tel=te;
}
void SeetData(char *u,int s,char *te) //设置单位,工资,电话
{
strcpy(unit,u);
salary=s;
strcpy(tel,te);
}
void PrintMen()
{
PrintBase();
cout<<*unit;
cout<<salary;
cout<<*tel;
}
};
class OldMen:public Base {
int salary;
char *tel;
public:
OldMen():Base(){}
OldMen(char *n, int y,int m,int d,char *bp,int s,char *te):Base(n,y,m,d,bp)
{
salary=s;
strcpy(tel,te);
}
void GetData(char *u,int *s,char *te)
{
salary=*s;
tel=new char[10];
tel=te;
}
void SeetData(int s,char *te)
{
salary=s;
strcpy(tel,te);
}
void PrintOldMen()
{
PrintBase();
cout<<salary;
cout<<*tel;
}
};
main()
{
AllChil m1("儿童", 16,12,13,"地点","信息");
Men m2("父母", 16,12,13,"地点","公司",12,"0110");
OldMen m3("老人", 16,12,13,"地点",12,"0110");
}
小弟指针学得不好,为啥调试通过执行时候出现错误(停止工作)?还有那个GET函数到底怎么写,老师是用获取地址,可是我怎么都不会写。函数形参为INT指针,而实参为INT变量,这些怎么传地址啊。请各位高手解决下。。。
可是,写成·数组的话怎么用NEW申请内存空间?
追答为什么要用new来申请空间呢?
一个人的名字你可以设计一个固定的大小,比如50个字节,不可以超过这个数字,否则返回一个错误,这样写有一个好处就是每一个类的成员的大小是固定的,不会出现一些诡异的错误。
好吧,如果你一定要用new来申请,那就只能写成指针了,不过提示你,new 完了要 delete,写起来很费劲,在析构函数中还有判断 name是否为空,不为空的话就delete
可是,不用new申请内存的话,里面的get函数到底怎么写,get和set函数的区别在于哪里?老师是说get函数是获取地址,要用到new。 如果用new的话,数组和指针的矛盾我又不会解决、、请你帮下忙,修改一下这段程序。。
追答get和set的区别是
get是得到数据
set是写入数据
也就是说,get函数是得到类的成员变量的值,而set是修改它的值
基本明白了,但是
void SetDate(int y,int m,int n) //设置出生年、月、日这样设置
{
Year=y;
Month=m;
Day=n;
}
int getx(){return x}可以这样写
而
void GetDate(int *y,int *m ,int *d) //获取出生年、月、日该怎么写
void GetName(char *m) //如是字符型呢?
最后写出两个例子我参考下,谢谢~
以GetDate(int *y,int *m int *d)为例,因为返回值有3个,年月日,所以用return的方法就明显不行,return只能返回一个值(这里不考虑类和结构体等因素),为了返回多个返回值,就将需要返回的值的地址传进子函数,然后由子函数修改地址里面的值,再回到主函数的时候,值也是被修改了的。
void GetDate(int *y,int *m int *d)
{
*y = Year;
*m = Month;
*d = Day;
}
这个写成这样就可以了,y,m ,d虽然是函数的参数,但是其实是返回值!
由于return只能返回一个,所以就将他们三个都以参数的形式传进来,将他们三个的指针传递进来之后,只要修改指针所指向地址的值修改,回到主函数之后也是被修改了的。
将函数需要的参数和函数需要返回的值都以参数的形式传递,然后函数的返回值用于判断函数调用是否成功,这个在实际应用中经常用到
你说说set和get函数的区别? 老师说 get函数是传地址的、、我不懂,望教~
追答set和get只是一个名字。。
一般来说set用于设置函数成员变量的值
get用于外部读取成员变量的值。
至少我认为这样更符合命名的规范。你愿意写成别的名字完全可以。
你停止运行的关键是,name没有分配空间。。
set 和 get函数是老师给我的模版,我实在搞不懂两者的区别,你可以举个例子来看看吗?