C++作业问题(指针),高手来帮帮忙

设计一个描述儿童、成人和老人的类,儿童分为学龄前和学龄期儿童,成人有工作,老人已退休。提取共性作为基类,并派生出满足要求的各个类及每一个类上的操作。设计一个完整的程序,并完成测试程序的正确性。
#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变量,这些怎么传地址啊。请各位高手解决下。。。

1. char *Name; //姓名
这里不要这么写,要写成 char Name[50]; //姓名
因为 char *Name 只是申请了一个指针,它没有自己的空间,只有申请成数组的形式,它才有了属于自己的空间,然后才可以用一个指针去指向这个空间,这个是你执行的时候出现错误的原因

2. get函数 void GetDate(int *y,int *m ,int *d) //获取出生年、月、日
{
Year=*y;
Month=*m;
Day=*d;
}
以它为例
{
*y = Year;
*m = Month;
*d = Day;
}
因为你的参数其实是你要返回的东西,那这个东西当然是被赋值的,所以要写在左边,修改*y的值。
用的时候:
int y,m,d
GetDate(&y,&m ,&d);
就可以了,先声明一个 y ,这样,y就有了自己的空间,里面存放的是y 的数据,这时候如果申请int *p; p是一个指针,它可以指向任何地方,但是本身并没有属于自己的空间,它一定要指向一个地方之后才有意义,比如 p = &y; 这样 p就是指向y 的指针了追问

可是,写成·数组的话怎么用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只能返回一个,所以就将他们三个都以参数的形式传进来,将他们三个的指针传递进来之后,只要修改指针所指向地址的值修改,回到主函数之后也是被修改了的。
将函数需要的参数和函数需要返回的值都以参数的形式传递,然后函数的返回值用于判断函数调用是否成功,这个在实际应用中经常用到

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-09
你get怎么是给类成员赋值?
void GetName(char *m) //获取姓名
{
Name=new char[10];
Name=m;
}
明显写反了嘛。。

还有。。你的name怎么没有在构造函数分配空间?也没有析构函数释放动态分配的空间。。
草草一看感觉问题很多啊追问

你说说set和get函数的区别? 老师说 get函数是传地址的、、我不懂,望教~

追答

set和get只是一个名字。。
一般来说set用于设置函数成员变量的值
get用于外部读取成员变量的值。

至少我认为这样更符合命名的规范。你愿意写成别的名字完全可以。

你停止运行的关键是,name没有分配空间。。

追问

set 和 get函数是老师给我的模版,我实在搞不懂两者的区别,你可以举个例子来看看吗?

第2个回答  2011-06-09
Base( char *n, int y,int m,int d,char *bp)
{
strcpy(Name,n); // 错误没有分配空间就拷贝
Year=y;
Month=m;
Day=d;
strcpy(BothPlace,bp);// 错误没有分配空间就拷贝
}