簡體   English   中英

拋出異常

[英]Exception thrown

我正在做一個項目,我是初學者。 該項目涉及人、成人、兒童和轉向架 class。 在轉向架adultcount中,我將名為成人的類型指針初始化為adult = new Adult [adultcount] ,其中成人計數是用戶想要添加的成人人數。
當我在輸入中只添加一個成年人時,它工作正常,它接受輸入並在 for 循環中分配值時分配它。
但是當我添加多個時,它會停止工作並在Adults[i].setdata()行拋出異常。

#include<iostream>
#include<string>
using namespace std;
class Person {
public:
    string Name;
    int Age;
    string Gender;
public:
    Person()
    {
        Name = '\0';
        Age = 0;
        Gender = '\0';
    }
    Person(string Name, int Age, string Gender)
    {
        this->Name = Name;
        this->Age = Age;
        this->Gender = Gender;
    }
    virtual void setdata()
    {
        string name, gender;
        int age;
        cin.ignore();
        cout << " enter Name :";
        getline(cin, name, '\n');
        this->Name = name;
        cout << endl;
        cout << " Enter gender ";
        getline(cin, gender, '\n');
        this->Gender = gender;
        cout << endl;
        cout << " Enter age ";
        cin >> age;
        Age = age;
        cout << endl;

    }
    virtual void printinfo()
    {
        cout << " name " <<Name;
        cout << " Gender " << Gender;
        cout << " age : " << Age;
    }

};
class Adult :public Person {
public:
    string Occupation;
    string Qualification;
    string NIC;

    Adult():Person()
    {
        Occupation = '\0';
        Qualification = '\0';
        NIC = '\0';
    }
    Adult(string Occupation, string Qualification, string NIC, string Name, int Age, string Gender) : Person(Name, Age, Gender)
    {
        this->Occupation = Occupation;
        this->NIC = NIC;
        this->Qualification = Qualification;
    }
    void setdata()
    {
        Person::setdata();
        string occupation, qualification/*, name, gender,*/ ,cnic;
           /* int age;*/
            cin.ignore();
           /* cout << " enter Name :" ;
            getline(cin, name, '\n');
            this->Name = name;
            cout << endl;*/
            cout << "enter occupation ";
            getline(cin, occupation, '\n');
            this->Occupation = occupation;
            cout << endl;
            /*cout << " Enter gender ";
            getline(cin, gender, '\n');
            this->Gender = gender;
            cout << endl;*/
            cout << " enter qualification ";
            getline(cin, qualification, '\n');
            this->Qualification = qualification;
            cout << endl;
            cout << " Enter cnic ";
            getline(cin, cnic, '\n');
            this->NIC = cnic;
            cout << endl;
           /* cout << " Enter age ";
            cin >> age;
            this->Age = age;
            cout << endl;*/

    }
    void printinfo()
    {
        Person::printinfo();
        /*cout << " name "<<Name << endl;*/
        cout << " occupation " << Occupation << endl;
        /*cout << " Gender " << Gender << endl;*/
        cout << " Qualifcation " << Qualification << endl;
        /*cout << " Age " << Age << endl;
        cout << " Gender " << Gender << endl;*/

    }
};
class kid :public Person {
public:
    string B_form_number;

    kid() : Person()
    {
        B_form_number = '\0';
    }
    kid(string B_form_number, string Name, int Age, string Gender) :Person(Name, Age, Gender)
    {
        this->B_form_number = B_form_number;
    }
    void setdata()
    {

        Person::setdata();
        string bform;
        cout << " Enter B Form number ";
    /*  getline(cin, bform, '\n')*/;
    cin >> bform;
        this->B_form_number = bform;
        cout << endl;

    }
    void setbform()
    {
        string bform;
        cout << " Enter B Form number ";
        getline(cin, bform, '\n');

        this->B_form_number = bform;
        cout << endl;
    }
    void printinfo()
    {
        Person::printinfo();
        cout << " b form number " << B_form_number;
    }
};
class Bogie /*:public kid*/ {
    int Bogie_ID;
    Bogie* next;
    Person* Adults;
    Person* kids;
    string familyName;
    int adultcount;
    int kidcount;
public:
    Bogie(int id)
    {
        Bogie_ID = id;
        next = nullptr;
        Adults = nullptr;

        kids = nullptr;
        familyName = '\0';
        adultcount = 0;
        kidcount = 0;
    }
    void AddPassengers() // should add adults and kids information etc
    {

        string familyName;

        cout << "Enter family name " << endl;
        cin.ignore();
        getline(cin, familyName, '\n');
        this->familyName = familyName;

        bool condition = false;
        bool condition2 = false;
        while (condition == false) // runs until valid input for adults
        {
            cout << " How many adults in the  family " << endl;
            cin >> adultcount;
            if (adultcount >= 1 && adultcount <= 4)
            {
                condition = true;
            }
            else
            {
                cout << " Invalid input " << endl;
                cout << " We have seats for 4 adults " << endl;
                condition = false;
            }
        }
        while (condition2 == false) //runs until valid input for kids
        {
            cout << " How many kids in the  family " << endl;
            cin >> kidcount;
            if (kidcount >= 1 && kidcount <= 6)
            {
                condition2 = true;
            }
            else
            {
                cout << " Invalid input " << endl;
                cout << " We have seats for 6 kids " << endl;
                condition2 = false;
            }
        }

        this->Adults = new Adult[adultcount];

        for (int i = 0; i < adultcount; i++)
        {

            Adults[i].setdata();


        }
            }



    }
};

int main()
{
    Bogie a(1);
    a.AddPassengers();
    a.Print();


}

我相信您需要將AdultsPerson *更改為Adult *

當程序嘗試訪問Adults[1]

for (int i = 0; i < adultcount; i++)
{
    Adults[i].setdata();
}

它在數組中跳到sizeof(Person)前面,而數組中的對象是sizeof(Adult) ,這會導致您看到的異常。

所以我找到了合適的方法,即在成員中將名為成人和兒童的指針聲明為 Person ** Adults; Person **kids 然后是成年人 = new Person * [adultcount];

    for (int i = 0; i < adultcount; i++)
    {


        adults[i] = new Adult;
        adults[i]->setdata();

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM