private修饰方法的数据应该只有实例自己的成员函数能访问啊,为什么print函数中t.data没报错

求大神找错,能运行,但有错误!!_c++吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:264,507贴子:
求大神找错,能运行,但有错误!!收藏
上图是一个多重继承的类继承关系示意图,各类的主要数据成员有说明,请自己定义合理的成员函数,编程实现体现该继承关系的程序,并定义教师对象、学生对象、研究生对象、在职研究生对象,输出他们的信息。数据成员包括以下几点(1)数据类Data:成员name保存姓名。(2)教师类Teacher:增加成员sal保存工资。(3)学生类Student:增加成员id保存学号。(4)研究生类Postgrad:增加成员dn保存系别。(5)教师中的在职研究生类Tpost:不另外定义成员。关于成员函数:各类中定义输出所有数据成员的函数void print() 代码 错误截图 在二楼
大神帮帮忙
上海达内c++一般需要4-8周,就可以完全掌握.上海c++的费用根据培训课时定,120天从入门到精通..
#include&iostream&#include&string&#include&cstring&const int N=2;class data{protected:
char name[20];
void print();
void output();
char *getname();};data::data(){
strcpy(name,&00&);}char* data::getname(){ }void data::print(){
cout&&&请输入信息&&&
cout&&&姓名:&;
cin&&}void data::output(){
cout&&&姓名:&&&name&&}/*-------分割线----------------*/class teacher:virtual public data{protected:public:
void print();
void output();};void teacher::print(){
data::print();
cout&&&工资:&;
cin&&}void teacher::output(){
data::output();
cout&&&工资:&&&sal&&}/*-------分割线----------------*/class student:virtual public data{protected:
char id[10];public:
void print();
void output();};void student::print(){
data::print();
cout&&&学号:&;
cin&&}void student::output(){
data::output();
cout&&&学号:&&&id&&}/*-------分割线----------------*/class postgrad:virtual public student{protected:
char dn[15];
//保存所属院系public:
void print();
void output();};void postgrad::print(){
data::print();
cout&&&系别:&;
cin&&}void postgrad::output(){
data::output();
cout&&&系别:&&&dn&&}/*-------分割线----------------*/class tpost:public postgrad,public teacher{public:
void print();
void output();};void tpost::print(){
data::print();}
void tpost::output(){ data::output();}/*-------分割线----------------*/class inter{protected:
student st[N];
teacher te[N];
postgrad po[N];
tpost tp[N];
void display();
void run();
void print();
void output();};inter::inter(){
numofst=0;
numofte=0;
numofpo=0;
numoftp=0;}void inter::display(){ cout&&&*********0.退
出*********&&& cout&&&*********1.录入信息*********&&& cout&&&*********2.浏览信息*********&&&}void inter::run(){
display();
cout&&&请选择操作选项:&;
switch(choice)
case 1: print();
case 2: output();
}while(choice);}void inter::print(){
//下面的output函数中变量type我用的是int类型,刚开始我以为是因为type类型出错的
//用两个不同类型后感觉错误不在这里,最后也没改回来。
cout&&&请选择你要输入的人员类型(1-学生 2-教师 3-研究生 4-在职研究生):&;
if(type==*1*)
if(numofst==N)
cout&&&人数已满,无法继续录入!&&&
for(i=0;(st[i].getname())!=&00&;i++)
//这里和下面的两个没有用strcmp判断,发现如果选1或者2
st[i].print();
//即没有用strcmp判断的选项后,可以输入姓名 学号(工资)
numofst++;
//但是输入完后还是要报错
else if(type==*2*)
if(numofte==N)
cout&&&人数已满,无法继续录入!&&&
for(i=0;(te[i].getname())!=&00&;i++)//strcmp(te[i].getname(),&00&)!=0
te[i].print();
numofte++;
else if(type==*3*)
if(numofpo==N)
cout&&&人数已满,无法继续录入!&&&
for(i=0;strcmp(po[i].getname(),&00&)!=0;i++) //这里用了strcmp,选择3或者4后,不能进入输入信息
po[i].print();
//的步骤,直接跳转到“继续输入?(y/n)”这一选项
numofpo++;
else if(type==*4*)
if(numoftp==N)
cout&&&人数已满,无法继续录入!&&&
for(i=0;strcmp(tp[i].getname(),&00&)!=0;i++)
tp[i].print();
numoftp++;
else if((type!=*1*)&&(type!=*2*)&&(type!=*3*)&&(type!=*4*))
cout&&&选择有误&&&
cout&&&继续输入?(y/n)&&&
}while(ch==*y*);}void inter::output(){
cout&&&请输入你要查看的人员类型(1-学生 2-教师 3-研究生 4-在职研究生): &;
if(type==1)
if(numofst==0)
cout&&&没有学生数据&&&
for(i=0;i&N;i++)
if(strcmp(st[i].getname(),&00&)!=0)
st[i].output();
if(type==2)
if(numofte==0)
cout&&&没有教师数据&&&
for(i=0;i&N;i++)
if(strcmp(te[i].getname(),&00&)!=0)
te[i].output();
} if(type==3) {
if(numofpo==0)
cout&&&没有研究生数据&&&
for(i=0;i&N;i++)
if(strcmp(po[i].getname(),&00&)!=0)
po[i].output();
} } if(type==4) {
if(numoftp==0)
cout&&&没有在职研究生数据&&&
for(i=0;i&N;i++)
if(strcmp(tp[i].getname(),&00&)!=0)
tp[i].output();
} } else if((type!=1)&&(type!=2)&&(type!=3)&&(type!=4)) {
cout&&&选择有误&&& }}int main(){
return 0;}
for(i=0;(st[i].getname())!=&00&;i++) st[i].print(); 这个条件不对!你在看看!
额 大神们 我看不懂了哎!可以教一点吗?、
你要是不着急的话,一会我给你重写下这些类!
#include &iostream&#include &string.h&const int MAX_ARRAY = 3;class Data{
virtual ~Data(){}//基类,所以为虚析构函数
virtual void print() const = 0;//在派生类中重写此函数,此函数的是用来显示类信息
virtual void Init() = 0;//用来输入信息
void name( const char* name )//设置名字
{ m_name = }
const char* name() const//返回名字
{ return m_name.c_str(); }
string m_};class Student : virtual public Data{
Student():m_id(0){}
void print() const
{ cout&&&学生名字:&&&name()&&&\n学号:&&&ID()&& }
void Init();
unsigned int ID() const //重载ID函数
{ return m_ }
void ID( unsigned int id )
{ m_id = }
unsigned int m_};class Postgrad : public Student{
void print() const
{ Student::print(); cout&&&系别:&&&Dn()&& }
void Init();
const char* Dn() const
{ return m_dn.c_str(); }
void Dn( const char* dn )
{ m_dn = }
string m_};class Teacher : virtual public Data{
Teacher():m_sal(0){}
void print() const
{ cout&&&教师名字:&&&name()&&&\n工资:&&&Sal()&& }
void Init();
unsigned int Sal() const
{ return m_ }
void Sal( unsigned int sal )
{ m_sal = }
unsigned int m_};class Tpost : public Teacher, public Postgrad{
void print() const
{ cout&&&名字:&&&name()&&&\n学号:&&&ID()&&&\n系别:&&&Dn()&&&\n工资:&&&Sal()&& }
void Init();
private:};void Student::Init()
cout&&&姓名:&;
string strN
cin && strN
name( strName.c_str() );
cout&&&学号:&;
unsigned int iID = -1;
cin && iID;
ID( iID );
}void Teacher::Init()
cout&&&姓名:&;
string strN
cin && strN
name ( strName.c_str() );
cout&&&工资:&;
unsigned int iSal = -1;
Sal( iSal );
}void Postgrad::Init()
Student::Init();
cout&&&系别:&;
string strDn;
cin && strDn;
Dn( strDn.c_str() );
}void Tpost::Init()
cout&&&姓名:&;
string strT
cin && strT
name( strTmp.c_str() );
cout&&&学号:&;
unsigned int iTmp = -1;
ID ( iTmp );
cout&&&工资:&;
iTmp = -1;
Sal( iTmp );
cout&&&系别:&;
cin && strT
Dn( strTmp.c_str() );
}class Manager{
void Run();
protected:
int printinfo();
int inputinfo();
int printdata( Data* pData);
Student student[MAX_ARRAY];
Tpost tpost[MAX_ARRAY];
Teacher teacher[MAX_ARRAY];
Postgrad postgrad[MAX_ARRAY];
int m_teac, m_post, m_tpost, m_};void Manager::Run()
m_stu = m_post = m_tpost = m_teac = 0;
int error_runtimes = 0;
while ( 1 )
cout&&&\n*****************************************&&&
cout&&&*\t*********0.退出!***********\t*\n&;
cout&&&*\t*********1.输入信息!*******\t*\n&;
cout&&&*\t*********2.显示信息!*******\t*\n&;
cout&&&请选择操作类型:&;
switch ( choice )
inputinfo();
printinfo();
cout&&&类型选择错误,请重新选择!\n&;
if ( error_runtimes++ & 10 )
}int Manager::printinfo()
cout&&&请选择查看类型(1-学生,2-教师,3-研究生,4-在职研究生):&;
int choice = -1;
switch( choice )
if ( m_stu == 0 )
cout&&&还没有录入学生信息!&&&
for ( int i = 0; i & m_ ++i )
printdata( student + i );
if ( m_teac == 0 )
cout&&&还没有录入教师信息!&&&
for ( int i = 0; i & m_ ++i )
printdata( teacher + i );
if ( m_post == 0 )
cout&&&还没有录入研究生信息!&&&
for ( int i = 0; i & m_ ++i )
printdata( postgrad + i );
if ( m_tpost == 0 )
cout&&&还没有录入在职研究生信息!&&&
for ( int i = 0; i & m_ ++i)
printdata( tpost + i );
cout&&&类型选择错误!\n&;
return -1;
}int Manager::inputinfo()
cout&&&请选择要输入的类型(1-学生,2-教师,3-研究生,4-在职研究生):&;
switch ( choice )
if ( m_stu & MAX_ARRAY )
student[m_stu++].Init();
cout&&&学生人数已满\n&;
if ( m_teac & MAX_ARRAY )
teacher[m_teac++].Init();
cout&&&教师人数已满\n&;
if ( m_post & MAX_ARRAY )
postgrad[m_post++].Init();
cout&&&研究生人数已满\n&;
if ( m_tpost & MAX_ARRAY )
tpost[m_tpost++].Init();
cout&&&在职研究生人数已满!\n&;
cout&&&类型选择错误,请重新选择!&;
cout&&&是否要继续y/n:&;
} while ( ch == *y* || ch == *Y* );
}int Manager::printdata( Data* pData )
pData-&print();
}int main(){
manager.Run();
return 0;}
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或C++中各种数据成员及成员函数的定义及使用
1.类是自定义的数据类型.类与应用程序不同,类的功能虽然独立,但不能独立启动,就象汽车零件那样.
2.Class 是一种数据类型, 其变量为对象.对象包含有member
variables(成员变量)和member
functions(成员函数).
class Date{
& int year, month,
& void set(int y,int m,int d);&
// 赋值操作
isLeapYear();&&&&&&&&&&&&&
// 判断闰年
print();&&&&&&&&&&&&&&&&&&&
// 输出日期
3.在类(class)中 , 成员函数及成员变量会分为两大类 : public members
(公开成员)、private members
(私有成员)
1.) public members :被定义为public members 的成员函数及成员变量
, 可在任何的函数中被使用 .包括main函数,及其它非成员函数.
2.) private members :被定义为private members
的成员函数及成员变量 , 只能在成员函数中被使用 .
4.成员函数在类外部定义时,在函数名称前应加上日期类名前缀Date和命名空间引导符“::”,它表示着自己属于某一个名空间(类),与普通函数相区别。
void Date::set(int y,int m,int
year=y;& month=m;
&day=d;& }
成员函数可以在类内,也可以在类外定义,若在类内定义,则默认为内联函数(inline)
5.对象是拥有操作的实体,是由类创建的
6.访问成员函数的方式
&(1)对象方式&& Date
&(2)对象指针方式&
Date* dp = new D
& dp-&set();
<font COLOR="#.成员函数的操作,如果只对对象进行读操作,则该成员函数可以设计为常对象成员函数,好处是让使用者一目了然的知道该成员函数不会改变对象值,同时让类的实现者更方便地调试。
常成员函数的声明和定义在形式上必须一致,即在函数形参列表的右括号后面加上const。如
&class Date{
&void set(int y,int m,int d);
&void print()
&inline void Date::print()
cout&&setfill('0');
cout&&setw(4)&&year&&'-'&&setw(2)&&month&&'-'&&setw(2)&&day&&'\n';
& cout&&setfill('
<font COLOR="#.常成员函数& 对捆绑的对象,
不允许写操作函数的常量参数& 对传递的参数,
不允许写操作
Date::comp(const Date& a)
&&& year = 2005;
// error: 常成员函数捆绑的对象
&&& a.year =
2003;& // error: 常量对象
&&& return
year==a.year &&
&&&&&&&&&&
month==a.month &&
&&&&&&&&&&
<font COLOR="#.一个整型变量的前增量操作的结果与变量值是一样的,而且前增量操作的结果是左值,操作可以连贯,而后增量操作的结果是增量之前的变量值,它是临时变量,当表达式计算工作完成后,该临时变量随即消失,所以变量最终值与后增量结果是错位的,
如: int a=1,b=1,c
&(++a)++;&
//a结果为3
& (b++)++;//结果b=2,(b++)的结果是临时变量,在其加1随后又抛弃
&++(++c);//结果c=3
&++(d++);//结果d=2,与b相似<font COLOR="#.C++将struct纳入了类机制中,struct也可以包含成员函数,与class的区别在于关键字不同,默认的访问控制符不同,struct默认访问控制符为public。
<font COLOR="#.类的静态数据成员,保证每个类只有一个实体。每个对象不再有它的副本。如:
#include&iostream&
//-------------------------------------
class Student{
& static int
& void set(string str)
&&& name =
& void print()
cout&&name&&"
-& students are
"&&number&&"
numbers\n";
int Student::number =
//静态数据成员在类外分配空间和初始化//-------------------------------------
& Student s1;
& s1.set("Jenny");
& Student s2;
& s2.set("Randy");
& s1.print();
int main()
& s.set("Smith");
& s.print();
system("pause");
程序执行结果:Jenny-&students are
&&&&&&&&&&&&&&&&&&&&&&&&
Smith-&students are
<font COLOR="#.静态成员函数一般设计为公有的,以访问私有静态数据成员为目的.调用方式是以类名加域操作符::后跟静态成员函数.如:
class Student{
& static int
// 静态私有成员& string
& static void showNum()
  cout&&num&&“\n”;&&
// 访问静态私有成员
int Student::num = 0; //
静态数据成员初始化int main()
s.showNum();&&&&&&&
// 可行,但非标准
& Student::showNum(); //
静态成员函数调用}
<font COLOR="#.静态成员函数的定义在类外边时,类名前应该免去static,只在声明时必要。
静态成员函数不能访问本类中非静态的数据成员。但可以访问传入对象的私有成员。
void showNum(Student
cout&&name&&“\n”;&&&
// 错 访问私有成员 cout&&s.name&&“\n”;&&
// 访问给定对象的私有成员  }
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 private修饰类 的文章

 

随机推荐