2013-07-15 3 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, который является дочерним классом, что-то пошло не так, это не займет ввода пользователя, вместо этого он сразу попросит меня ввести текущий мировой рейтинг. Вот мой .cpp для класса TennisPlayer:

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

Смешивание '' '' '' '' '' проблемы '' '' '' '' '' '' '' '' '' '' '' '. – greatwolf

+0

'cin >> get_annual_salary();' Помимо любых других проблем, это gong, чтобы читать временный 'float', который немедленно отбрасывается. Таким образом, все это действительно игнорирует что-то в потоке (и/или возможно устанавливает флаг ошибки в потоке). – BoBTFish

+0

Имеет ли 'getline (cin, get_name())' 'собственно компилировать? 'get_name()' возвращает строку по значению, которая является rvalue. – greatwolf

ответ

2

Угадайте, я бы сказал, что наследование не ваша проблема, но getline. Часто символ «вводить» остается во входном буфере, что означает, что следующая строка ввода кажется пропущенной, потому что она просто читает этот символ. Попробуйте поставить cin.get(); перед тем, как позвонить в getline(), чтобы очистить этот дополнительный символ.

EDIT: позвольте мне реорганизовать некоторые из кода:

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(). То, что я пытаюсь сделать, это наследовать атрибут от родителя и переопределить его, но я понятия не имею, как именно я использовал метод доступа вместо –

+0

Но это не позволит мне ввести имя теннисного игрока.Это просто подталкивает меня к вкладу в годовой оклад и текущий мировой рейтинг. Это что-то пошло не так с моим конструктором? –

+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

Спасибо большое за его исправление –

Смежные вопросы