注册 登录
编程论坛 C++教室

这道程序神奇了,大大们快来看看!

小编程员 发布于 2009-08-26 23:29, 1184 次点击
#include <iostream>
using namespace std;

 //宠物类别:狗、猫、鸟、鱼、爬行动物、昆虫、其他
enum PetType{DOG, CAT, BIRD, FISH, REPTILE, INSECT, OTHER};

class Pet{  //宠物类
  PetType type;    //类别
  char name[20];   //名字
public:
  Pet(PetType type, char name[]){
    this->type=type;
    // 这里有不同
   strcpy(this->name,name);

  }

  PetType getType()const{ return type; }
  const char* getName()const{ return name; }
  const char* getTypeString()const{
    switch(type){
      case DOG: return "a dog";
      case CAT: return "a cat";
      case BIRD: return "a bird";
      case FISH: return "a fish";
      case REPTILE: return "a reptile";
      case INSECT: return "an insect";
    }

    return "an unknown animal";
  }
  void show()const{
    cout<<"There is "<<getTypeString()<<" named "<<name<<endl;
  }
};

int main(){
  Pet a_dog(DOG, "Doggie");
  Pet a_cat(CAT, "Mimi");
  Pet an_animal(OTHER, "Puppy");
  a_dog.show();
  a_cat.show();
  an_animal.show();
  return 0;
}


输出结果为There is a dog named Doggie
          There is a cat named Mimi
          There is an unknown animal named Puppy


但对name数组的赋值进行了小的更该,输出结果变成了type的改变,真是奇怪了,望高手给予解释!
更改如下:


#include <iostream>
using namespace std;

 //宠物类别:狗、猫、鸟、鱼、爬行动物、昆虫、其他
enum PetType{DOG, CAT, BIRD, FISH, REPTILE, INSECT, OTHER};

class Pet{  //宠物类
  PetType type;    //类别
  char name[20];   //名字
public:
  Pet(PetType type, char name[]){
    this->type=type;
    // 这里有不同
   for(int i=0;i<=20;i++)this->name[i]=name[i];

  }

  PetType getType()const{ return type; }
  const char* getName()const{ return name; }
  const char* getTypeString()const{
    switch(type){
      case DOG: return "a dog";
      case CAT: return "a cat";
      case BIRD: return "a bird";
      case FISH: return "a fish";
      case REPTILE: return "a reptile";
      case INSECT: return "an insect";
    }

    return "an unknown animal";
  }
  void show()const{
    cout<<"There is "<<getTypeString()<<" named "<<name<<endl;
  }
};

int main(){
  Pet a_dog(DOG, "Doggie");
  Pet a_cat(CAT, "Mimi");
  Pet an_animal(OTHER, "Puppy");
  a_dog.show();
  a_cat.show();
  an_animal.show();
  return 0;
}

输出结果就变为了There is unknown animal named Doggie
          There is unknown animal named Mimi
          There is an unknown animal named Puppy

好像switch(type)函数根本没有运行一样,求教高手!
16 回复
#2
mfkblue2009-08-27 00:18
不觉得有什么神奇的,构造函数里形参和类私有数据名字一样,不出错才怪,程序格式看着也很难过.
#include <iostream>
using namespace std;

//宠物类别:狗、猫、鸟、鱼、爬行动物、昆虫、其他
enum PetType{DOG, CAT, BIRD, FISH, REPTILE, INSECT, OTHER};

class Pet
{  //宠物类
  PetType type;    //类别
  char name[20];   //名字
public:
  Pet(PetType type1, char name1[])
  {
    type=type1;
    for(int i=0;i<20;i++)
        name[i]=name1[i];
  }

  PetType getType()const{ return type; }
  const char* getName()const{ return name; }
  
  const char* getTypeString()const
  {
    switch(type)
    {
      case DOG: return "a dog";
      case CAT: return "a cat";
      case BIRD: return "a bird";
      case FISH: return "a fish";
      case REPTILE: return "a reptile";
      case INSECT: return "an insect";
    }

    return "an unknown animal";
  }
  void show()const{
    cout<<"There is "<<getTypeString()<<" named "<<name<<endl;
  }
};

int main(){
  Pet a_dog(DOG, "Doggie");
  Pet a_cat(CAT, "Mimi");
  Pet an_animal(OTHER, "Puppy");
  a_dog.show();
  a_cat.show();
  an_animal.show();
  return 0;
}
#3
newCpp2009-08-27 06:57
学习顶一下下
#4
宽心面2009-08-27 18:42
2楼有点所答非所问丫。。。。我也很想知道问题的答案,期待有高手来解答。。。
#5
宽心面2009-08-29 13:24
其实参数与类的私有数据名称一样,不会导致错误的,用this指针就解决了~!

2楼的编码我跑了一遍,关键在于for循环里面的条件有没有等号~~我也不知道为什么没有等号就能成功,而有等号就不成功了。。希望高手快来解答!
#6
宽心面2009-08-29 13:25
其实参数与类的私有数据名称一样,不会导致错误的,用this指针就解决了~!

2楼的编码我跑了一遍,关键在于for循环里面的条件有没有等号~~我也不知道为什么没有等号就能成功,而有等号就不成功了。。希望高手快来解答!
#7
black4232009-08-29 14:35
好神奇!
#8
black4232009-08-29 14:35
好神奇!
#9
newCpp2009-08-29 16:04
没有看明白
我晕
#10
newCpp2009-08-29 16:04
没有看明白
我晕
#11
mfkblue2009-08-29 16:27
。。。
那天没看清,上面定的数组就是name[20],循环里还<=20,数组访问出界。
和我前两天的错误一样,不过我是new出来小了,最后也是访问出界。
结论还是二楼一样.

[ 本帖最后由 mfkblue 于 2009-8-29 16:29 编辑 ]
#12
zzb4029530492009-08-29 20:38
在vc6.0上运行结果正确,但会提示程序出错。
楼主的问题应该归结于编译器的问题。至于那个for循环是不能有等号的。
你定义的数组大小20,下标是0到19,用等号的话就变成了0到20,超界!
这是很危险的,小程序还好,要是大程序的话后果不堪设想!
#13
easycpp2009-08-30 12:59
问题是在于数组越界了,也就是那个20惹得祸,数组的下标是:0-19;可是楼主却是0-20,多出来个1,可能改变了一些系统数据。
#14
平凡不在2009-08-30 22:21
回复楼主:
    你的两个程序(改前和改后)在我的电脑上运行都正常呀,是不是你的电脑的问题呀?
#15
realfree2009-08-31 12:34
没去运行这个程序,不过感觉除了那个越界问题外,其他没啥问题了
#16
wunianguo2009-08-31 17:40
ituyituyiuiuyi吗
#17
a26960262009-09-09 15:50
看了半天不懂
1