2013-07-15 118 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

非常感謝它的固定 –