【问题标题】:Inheritance in C++ (Parent and Child class)C++ 中的继承(父类和子类)
【发布时间】:2013-07-15 10:07:55
【问题描述】:

我有一个名为 Athlete 的父类,还有一个名为 TennisPlayer 的子类。我的父类中有两个属性,即姓名和年薪。还有一个 read 方法可以接收两个类的用户输入。这是我父母的样子:

class Athlete
{
public:
    Athlete();
    Athlete(string name, float annual_salary);
    virtual void read();
    virtual void display();
    string get_name() const;
    float get_annual_salary();
    void set_name(string name);
    void set_annual_salary(float annual_salary);
private:
    string name;
    float annual_salary;
};

class TennisPlayer : public Athlete
{
public:
    TennisPlayer();
    TennisPlayer(string name, float annual_salary, int current_world_ranking);
    int get_current_world_ranking();
    void set_current_world_ranking(int current_world_ranking);
    virtual void read();
    virtual void display();
private:
    int current_world_ranking;
};

运动员类的 read() 方法完美运行。但是当涉及到作为子类的tennisPlayer时,出了点问题,它不会接受用户输入,而是直接向我询问当前世界排名的输入。这是我的 TennisPlayer 类的 .cpp:

void TennisPlayer::read()
{
    cout << "Enter name for tennis player: " ;
    getline(cin, get_name());
    cout << "Enter annual salary for tennis player: ";
        cin >> get_annual_salary();
    cout << "Enter current world ranking: ";
    cin >> current_world_ranking;
}

tennisPlayer 类的构造函数:

TennisPlayer::TennisPlayer(string name, float annual_salary ,int current_world_ranking)
: Athlete(name , annual_salary)
{
    this->current_world_ranking = current_world_ranking;
}

在阅读tennisPlayer的年薪时也有问题。我不太熟悉 C++ 中的继承。提前致谢。

【问题讨论】:

  • 你的问题是混合&gt;&gt;提取运算符和getline()
  • cin &gt;&gt; get_annual_salary(); 除了任何其他问题之外,这是一个临时的float,它会立即被丢弃。所以这一切实际上就是忽略流中的某些内容(和/或可能在流上设置错误标志)。
  • getline(cin, get_name()); 真的可以编译吗? get_name() 正在按值返回一个字符串,它是一个右值。
  • 顺便说一句,它没有编译。我只是不知道如何在子类中获取父属性,所以我使用了访问器方法
  • 在用户输入中读取可能更容易和更直接,然后使用您已经定义的 mutator 设置值。我不确定您为什么要使用访问器方法读取值

标签: c++ inheritance polymorphism


【解决方案1】:

我猜我会说继承不是你的问题,而是getline。 'enter' 字符通常留在输入缓冲区中,这意味着下一个输入行似乎被跳过了,因为它只是读取了这个字符。尝试在调用 getline() 之前添加 cin.get(); 以清除这个多余的字符。

编辑:让我重构你的一些代码:

void TennisPlayer::read()
{
    string tennisName;
    float annualSalary;

    cout << "Enter name for tennis player: " ;
    cin.get();  <--read any leftover characters in the input buffer
    getline(cin, tennisName);  <--read in the value
    set_name(tennisName);   <--use parent's mutator to set the value

    cout << "Enter annual salary for tennis player: ";
    cin >> annualSalary;
    set_annual_salary(annualSalary);

}

附加: 孩子可以访问父类的公共和受保护方面。因此,另一种方法是使成员变量受到保护,以便子类可以访问它们,但它们仍然对外部类隐藏。

子类可以在没有范围解析的情况下从父类调用公共成员变量和函数,即不需要指定TennisPlayer::set_name,只需set_name就足够了。

【讨论】:

  • cin.get() 是什么意思。我想做的是从父级继承属性并覆盖它,但我不知道如何使用访问器方法来代替
  • 但这不允许我输入网球选手姓名。它只是提示我输入年薪和当前世界排名。我的构造函数有问题吗?
  • 这个和我原来的解决方案有关,把cin.get();在getline(cin,tennisName)之前;。查看我修改后的解决方案
  • 基本上,getline() 会读取所有字符,但不包括回车键,因此您接下来调用 getline() 只会读取回车键,仅此而已。它尝试将输入键字符分配给tennisName,然后转到annualSalary - 因此它似乎正在跳过。这是混合 cin >> 和 getline() 的症状。
【解决方案2】:

试试这个

void TennisPlayer::read()
{
    cout << "Enter name for tennis player: " ;
    string sName;
    getline(cin, sName);
    set_name( sName );

    cout << "Enter annual salary for tennis player: ";
    float salary;
    cin >> salary;
    set_annual_salary(salary);

    cout << "Enter current world ranking: ";
    int ranking;
    cin >> ranking;
    set_current_world_ranking(ranking);
}

getter 函数只是返回一个值。更改此值不会对值来自的对象做任何事情。您需要调用 setter 函数才能实际更改 TennisPlayer 对象。

【讨论】:

  • 非常感谢修复
猜你喜欢
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多