创建具有抛出构造函数的类的对象

Creating an object of a class with constructor that throws

本文关键字:对象 构造函数 创建      更新时间:2023-10-16

我正在学习例外。示例代码的目的是创建一个合适的对象。

#include <iostream>
#include <exception>
#include <string>
#include <stdexcept>
using std::string;
using std::invalid_argument;
using std::cin;
using std::cout;
using std::endl;
class Person
{
public:
    Person(){}
    Person(string name, int age)
    {
        if (age < 18)
            throw invalid_argument(name + " is minor!!!");
        if (name.empty())
            throw invalid_argument("Name can't be empty");
        _name = name;
        _age = age;
    }
    Person(Person&& that) : _name(std::move(that._name))
    {
        _age = that._age;
        that._name.clear();
    }
    Person& operator=(Person&& that)
    {
        _name = std::move(that._name);
        _age = that._age;
        that._name.clear();
        return *this;
    }
    Person(const Person& that)
    {
        _age = that._age;
        _name = that._name;
    }
    Person& operator=(const Person& that)
    {
        _name = that._name;
        _age = that._age;
        return *this;
    }
    ~Person() { cout << "In person destructor"; }
    string getName(void) const { return _name; }
private:
    string _name;
    int _age;
};
Person createPerson()
{
    try
    {
        string name;
        int age;
        cout << "Enter name of the person: ";
        cin >> name;
        cout << "Enter age of the person: ";
        cin >> age;
        Person aNewPerson(name, age);
        return aNewPerson;
    }
    catch (invalid_argument& e)
    {
        cout << e.what() << endl;
        cout << "Please try again!!!" << endl;
    }
}
int main(void)
{
    Person aNewPerson;
    aNewPerson = createPerson();
    cout << aNewPerson.getName() << " created" << endl;
    return 0;
}

我希望仅在构造了适当的对象时退出程序。例如,如果我输入name为APerson, age为1,就会抛出异常。但是,我想继续创建对象的过程,只有在成功创建对象后才退出程序。

我不知道怎么做。有人能帮忙吗?谢谢。

好的,我知道答案了,如果我错了请纠正我…我像这样修改了createPerson()函数…

Person createPerson()
{
    while (1)
    {
        try
        {
            string name;
            int age;
            cout << "Enter name of the person: ";
            cin >> name;
            cout << "Enter age of the person: ";
            cin >> age;
            Person aNewPerson(name, age);
            return aNewPerson;
        }
        catch (invalid_argument& e)
        {
            cout << e.what() << endl;
            cout << "Please try again!!!" << endl;
        }
    }
}