Heim > Fragen und Antworten > Hauptteil
为什么第一个是对应p[i].而第二个对应p[i]->
我运行了下,为什么第二个运行正确,而第一个能运行但是输入两组数就未响应了?而且我把数组长度N定义为1就都正常了,为什么?
#include<iostream.h>
#include<string.h>
#define N 2
class book
{char name[5]; int sold;
public:
virtual char*getname(char*na)=0;
virtual int getsold(int so)=0;
virtual void printname()=0;
virtual void printsold()=0;
virtual void compare()=0;
};
class master:public book
{char name[5]; int sold;
public:
master(){}
char*getname(char*na){strcpy(name,na);return name;}
int getsold(int so){sold=so;return sold;}
void printname(){
cout<<getname(name)<<endl;}
void printsold(){
cout<<getsold(sold)<<endl;}
void compare(){
if(sold>500){
printname();}}
};
main()
{
magazine n1,n2;
master m1,m2,m3,m4,m5;
char name[N];int sold;
book *p=new master[2]; //?
book *y[2]={&n1,&n2};
// magazine *t[10];
cout<<"输入图书名字和销量:"<<endl;
for(int i=0;i<=N-1;i++){
cin>>name>>sold;
p[i].getname(name); //?
p[i].getsold(sold);
}
cout<<"销量大于500的图书:"<<endl;
for(i=0;i<=N-1;i++){
p[i].compare();}}
////////////////////////////////////////
#include<iostream.h>
#include<string.h>
#define N 2
class book
{char name[5]; int sold;
public:
virtual char*getname(char*na)=0;
virtual int getsold(int so)=0;
virtual void printname()=0;
virtual void printsold()=0;
virtual void compare()=0;
};
class master:public book
{char name[5]; int sold;
public:
// master(char* na,int so):name(na),sold(so){}
char*getname(char*na){strcpy(name,na);return name;}
int getsold(int so){sold=so;return sold;}
void printname(){
cout<<getname(name)<<endl;}
void printsold(){
cout<<getsold(sold)<<endl;}
void compare(){
if(sold>500){
printname();}}
};
main()
{
magazine n1,n2;
master m1,m2,m3,m4,m5;
char name[N];int sold;
book *p[2]={&m1,&m2}; //book *p[2]={&m1,&m1}不可,因为p[i]->getname(name)函数会改变m1的值,使p[1],p[2]值一样,p只是指针,核心为&m1
book *y[2]={&n1,&n2};
// magazine *t[10];
cout<<"输入图书名字和销量:"<<endl;
for(int i=0;i<=N-1;i++){
cin>>name>>sold;
p[i]->getname(name);
p[i]->getsold(sold);
}
cout<<"销量大于500的图书:"<<endl;
for(i=0;i<=N-1;i++){
p[i]->compare();}
}
天蓬老师2017-04-17 14:32:19
之前看错了,重新修改一下答案:
卧槽,原来是这么鬼畜的写法!!!
你new
出来的是master[]
,而p
是book*
,怎么可以赋值过去啊~
所以当写成p[i]
的时候,找到的那块内存地址是p+i*sizeof(book)
而非p+i*sizeof(master)
sizeof(book)
和sizeof(master)
又不相等!所以你的p[i]
就是在内存中一块莫名其妙的卡在一半的地方,然后还把这个奇怪的地方当作master
去操作,显然会出错啊!
至于为啥N为1的时候不报错,那是因为,这时候你只访问了一个p[0]
,既然i==0
嘛,那上面的两个地址算出来是一样的咯