基类的指针传染媒介

时间:2012-12-22 15:13:05

标签: c++ pointers vector

忍受我。有3个班级。 Person是具有名称和年龄的基类。孩子是一个在学校成绩的派生班。父是另一个可以生孩子的派生类(是或否)

在我们继续之前,我必须指出一些事情: 这是一个我想到的练习,所以我可以练习继承。我们的想法是最终得到一个向量,该向量包含从基类到派生类对象的指针。

“程序”取决于用户输入正确的值,没有错误检查等等,但这不是本练习的重点,所以这就是我没有做过任何事情的原因。

非常感谢有关如何解决我遇到的问题的反馈。提前谢谢。

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

1 个答案:

答案 0 :(得分:1)

  1. 您在a中对vector<Person>int使用相同的变量名称for loop。因此,当您到达a.push_back(c);行时,程序会认为a是整数,而不是向量。

    使您的变量名称唯一。

  2. 正如其他人所提到的,您的容器是vector类型Person,但是您实例化了Child *Parent *类型的新派生类,所以vector应为Person*类型。

  3. 在同样的说明中,您的函数的返回类型应为vector<Person*>

  4. 虽然在这种情况下没有必要,因为您的申请会立即结束,但最好确保对new的每次通话都与对delete的通话相对应。在这种情况下,您将编写一个free_list方法,该方法遍历并删除列表中指向的每个Person对象。请注意,矢量本身不需要清理。