2013-07-15 120 views
2

我有一个名为Athlete的父类,并且有一个名为TennisPlayer的子类。我父母班有两个属性,分别是姓名和年薪。还有一个读取方法,用于两个类的用户输入。下面是我父母的样子:C++中的继承(父类和子类)

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; 
} 

Conctructor为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++中的继承。提前致谢。

+0

你的问题混合'>>'提取操作符和'getline()'。 – greatwolf

+0

'cin >> get_annual_salary();'除了任何其他问题,这是锣读入一个临时的'浮动',立即被丢弃。因此,所有这些确实会忽略流中的某些内容(和/或可能在流上设置错误标志)。 – BoBTFish

+0

'getline(cin,get_name());'实际编译? 'get_name()'是通过一个右值返回一个字符串。 – greatwolf

回答

2

在猜测我会说继承不是你的问题,但getline。通常'输入'字符留在输入缓冲区中,这意味着下一个输入行似乎被跳过,因为它只是读取这个字符。尝试在拨打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即可。

+0

cin.get()是什么意思。我想要做的是从父级继承属性并覆盖它,但我不知道如何使用accessor方法代替 –

+0

但是这不会让我输入tennisPlayer名称。它只是提示我输入年薪和当前世界排名。我的构造函数出了什么问题? –

+0

这与我原来的解决方案有关,把cin.get();在getline(cin,tennisName)之前;看到我的修改后的解决方案 – Katstevens

0

试试这个

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); 
} 

吸气功能简单地返回一个值。更改此值不会对值来自的对象执行任何操作。您需要调用setter函数才能实际更改TennisPlayer对象。

+0

非常感谢它的固定 –