用绳子练习

Exercise with string

本文关键字:练习      更新时间:2023-10-16

我在这里找到的练习 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的专有性,但是当我在主类中运行时,我无法显示两个动物的正确名称。

无论您的特定错误如何(评论者建议的参数顺序strcpy()(,问题定义和解决方案都存在一些问题。

习题3

用母类动物写一个probram。在它里面定义一个名称和一个年龄变量,以及set_value()函数。然后创建两个碱基变量斑马和海豚,它们写一条消息,告诉年龄,名称并提供一些额外的信息(例如出生地(。

关于这个问题,我们注意到的第一件事是措辞含糊不清。到底什么是"基础变量"?您是否被要求Animal子类?谁知道呢。至于原产地——是特定实例的"起源",还是整个阶级?而且 - 是Animal类还是继承子类?谁知道呢。

此外,set_value()成员函数确实是一件非常糟糕的事情。即使您的成员不是公开的,您仍然可以为每个字段使用单独的 setter 方法,例如void setName(const std::string& name).当然,使用引用或代理来设置和获取字段会更好,例如std::string& name()const std::string& name() const.

现在,关于你自己的代码,请注意斑马和海豚类实际上并没有不同的行为;它们的"消息"成员打印相同的东西,除了类名和原产地,它们是不同的数据。那么为什么还要为子类而烦恼呢?

此外,使用char数组不是一个好主意 - 除非有充分的理由不这样做,否则请使用std::string。这样,您就不会对名称长度进行人为限制。