0

我慢して。3つのクラスがあります。人は名前と年齢の基本クラスです。子供は学校の学年を持つ派生クラスです。親は、子を持つことができる別の派生クラスです(はいまたはいいえ)

続行する前に、指摘しなければならないことがいくつかあります。これは、継承を少し練習できるように考えた演習です。アイデアは、基本クラスから派生クラスオブジェクトへのポインターを含むベクトルで終わることです。

「プログラム」は、ユーザーが正しい値を入力するかどうかに依存し、エラーチェックなどはありませんが、それはこの演習のポイントではないため、私はそれについて何もしていません。

私が得ている問題を解決する方法についてのフィードバックは大歓迎です。前もって感謝します。

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Person
{
private:
    string m_name;
    int m_age;
public:
    Person(string name, int age)
    {
        m_name = name;
        m_age = age;
    }
    string get_name()
    {
        return m_name;
    }
    virtual void info() =0;
};

class Child : public Person
{
private:
    int m_grade;
public:
    Child(string name, int age, int grade) : Person(name, age)
    {
        m_grade = grade;
    }
    void info()
    {
        cout <<"I am a child. I go to the " << m_grade << " grade."<<endl;
    }
};

class Parent : public Person
{
private:
    bool m_child;
public:
    Parent(string name, int age, bool child) : Person(name, age)
    {
        m_child = child;
    }
    void info()
    {
        if(m_child == true)
        {
            cout << "I have a child." << endl;
        }
        else
        {
            cout << "I do not have a child" << endl;
        }
    }
};

vector create_list(const int& x)
{
    vector <Person> a;
    for(int a = 0; a < x; a++)
    {
        cout << "enter the name" << endl;
        string o;
        cin >> o;
        cout << "enter the age" << endl;
        int age;
        cin >> age;
        cout << "What would you like your person to be: a Child or a Parent?" << endl;
        string choice;
        cin >> choice;
        if(choice == "Child")
        {
            cout << "enter it's grade" << endl;
            int grade;
            cin >> grade;
            Child* c  = new Child(o, age, grade);
            a.push_back(c);
        }
        else
        {
            cout <<"enter if the parent has a child (yes/no)" << endl;
            string wc;
            cin >> wc;
            if(wc == "yes")
            {
                Parent* p = new Parent(o, age, true);
                  a.push_back(p);
            }
            else
            {
                Parent* p = new Parent(o, age, false);
                  a.push_back(p);
            }
        }
    }
    return a;
}

int main()
{
    cout << "How many people would you like to create?" << endl;
    int x;
    cin >> x;
     vector<Person> a = create_list(x);
     a[0]->getname();
    return 0;
}
4

1 に答える 1

1
  1. aの両方に同じ変数名を使用しています。したがって、行に到達すると、プログラムはそれがベクトルではなく整数であると見なします。vector<Person>intfor loop a.push_back(c);a

    変数名を一意にします。

  2. 他の人が述べているように、コンテナはvectorタイプのですが、タイプとPersonの新しい派生クラスをインスタンス化するので、タイプはタイプである必要があります。Child *Parent *vectorPerson*

  3. 同じように、関数の戻り値のタイプは次のようになります。vector<Person*>

  4. この場合、アプリケーションはすぐに終了するため必要ありませんが、へのすべての呼び出しがへnewの呼び出しに対応していることを確認することをお勧めしdeleteます。その場合free_list、リスト内でポイントされている各Personオブジェクトを調べて削除するメソッドを記述します。ベクトル自体はクリーンアップを必要としないことに注意してください。

于 2013-01-16T22:39:59.753 に答える