2

Athlete という親クラスと、TennisPlayer という子クラスがあります。私の親クラスには、名前と年俸の 2 つの属性があります。両方のクラスのユーザー入力を受け取る 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++ の継承についてよく知りません。前もって感謝します。

4

2 に答える 2

1

おそらく、継承はあなたの問題ではないと思いますが、getline. 多くの場合、'enter' 文字が入力バッファに残されます。これは、次の入力行がこの文字を読み取るだけであるため、スキップされているように見えることを意味します。この余分な文字をフラッシュするためcin.get();に、呼び出しの前に置いてみてください。getline()

編集:コードの一部をリファクタリングさせてください:

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

}

追加: 子は、親クラスのパブリックおよび保護された側面にアクセスできます。したがって、これを行う別の方法は、子クラスがアクセスできるようにメンバー変数を保護することですが、それらは依然として外部クラスから隠されています。

子クラスは、スコープ解決なしで親クラスから public メンバー変数と関数を呼び出すことができます。つまり、指定する必要はなくTennisPlayer::set_nameset_nameそれで十分です。

于 2013-07-15T10:10:39.080 に答える
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);
}

getter 関数は単に値を返します。この値を変更しても、値の元のオブジェクトには何も影響しません。オブジェクトを実際に変更するには、セッター関数を呼び出す必要がありTennisPlayerます。

于 2013-07-15T10:24:32.887 に答える