我在这里找到的练习有问题exercise 3。我在这里报道。
#include <iostream>
#include <cstring>
using namespace std;
class Animal
{
protected:
int age;
char name[10];
public:
void set_data (int a, char b[10]) // the set data is inherited by here to the two classes Zebra and Dolphin
{
age = a;
strcpy(b,name);
}
};
class Zebra:public Animal
{
public:
void message_zebra() {
cout<< "The zebra named "<< name <<" is "<< age << " years old. The zebra comes from Africa. \n";
}
};
class Dolphin: public Animal
{
public:
void message_dolphin() {
cout<< "The dolphin named "<< name << " is "<<age << " years old. The dolphin comes from New Zeland.\n";
}
};
int main ()
{
Zebra zeb;
Dolphin dol;
char n1[10] = "Max";
char n2[10] = "John";
zeb.set_data (5,n1);
dol.set_data (2,n2);
zeb.message_zebra() ;
dol.message_dolphin() ;
return 0;
}
原则上,我有两个基类继承了类Animal
的属性,但是当我在主要运行它时,我无法显示两个动物的正确名称。
答案 0 :(得分:1)
无论您的具体错误(strcpy()
参数命令作为评论者建议),问题定义和解决方案都存在一些问题。
练习3
用母亲类动物写一个probram。在里面定义名称和年龄变量,以及
set_value()
函数。然后创建两个基本变量Zebra和Dolphin,它们会写出一条消息,告诉年龄,名称并提供一些额外信息(例如原产地)。
我们注意到这个问题的第一件事是措辞含糊不清。什么是“基础变量”呢?你被要求继承Animal
吗?谁知道。至于原产地 - 它是特定的实例'起源,还是整个阶级'?而且 - 它是Animal
类还是继承子类?谁知道呢。
此外,set_value()
成员函数真的非常糟糕。即使您的成员不公开,您仍然可以为每个字段设置单独的setter方法,例如void setName(const std::string& name)
。当然,使用引用或代理设置和获取字段会更好,例如std::string& name()
和const std::string& name() const
。
现在,关于您自己的代码,请注意Zebra和Dolphin类实际上没有不同的行为;和他们的“消息”成员打印相同的东西,除了类名和原产地,这是不同的数据。那么为什么甚至打扰一个子类?
此外,使用char
数组并不是一个好主意 - 使用std::string
除非有充分的理由不这样做。这样,您就不会对名称长度进行人为限制。