用字符串练习

时间:2018-05-08 12:59:51

标签: c++

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

1 个答案:

答案 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除非有充分的理由不这样做。这样,您就不会对名称长度进行人为限制。