构造函数中的异常 - C ++

时间:2017-11-07 23:01:40

标签: c++ exception

所以,我想限制在没有使用try-throw-catch的构造函数中给出的参数的对象。这是我到目前为止所写的内容。但它不能正常工作,我该怎么办?没有错误,只返回0。

#include <iostream>

using namespace std;

class Person
{
    public:
        Person(int _age)
        {
            age = _age;

            try
            {
                if (age == -1)
                {
                    throw 1;
                }
            }

            catch (int x)
            {
                cout << "You have to specify person's age" << endl;
            }
        }

    private:
        int age = -1;
};

int main(void)
{
    Person a();
    return 0;
}

1 个答案:

答案 0 :(得分:2)

问题1:

Person a();

令人烦恼的解析。这不会声明变量并调用构造函数,它会声明返回a的函数Person

解决方案:

Person a;

但这会产生问题2:

没有默认构造函数。指定Person(int _age)定义非默认构造函数,这会阻止编译器生成默认(无参数)构造函数。这实际上是一个胜利,因为你声明的目标是无法构造一个没有参数的Person

你不能

Person a;

你必须

Person a(<an int>);

这不会阻止用户

Person a(-1);

这对anyone not from Ork.没有多大意义这为在构造函数中使用异常设置了一个很好的例子,并暴露了问题3:

构造函数有两种不结束程序的方法:使用构造对象和抛出异常。在构造函数中抛出和捕获信号构造失败的异常都是不寻常的,因为它允许返回一个构造不正确的对象。

所以

Person(int _age)
{
    age = _age;

    try
    {
        if (age == -1) // probably should reject age < 0
        {
            throw 1;
        }
    }

    catch (int x)
    {
        cout << "You have to specify person's age" << endl;
    }
}

实际上会导致您试图避免的问题。

解决方案:

Person(int _age)
{
    age = _age;
    if (age == -1)
    {
        throw 1;
    }
}

并在main

int main(void)
{
    try
    { 
        Person a();
        // use a
        return 0;
    }
    catch (int x)
    {
        cout << "You have to specify person's age" << endl;
        return -1;
    }
}

可以做出一项重大改进:使例外变得有意义

投掷1包含的上下文太少而无意义。你可以抛出并捕获一个自定义异常,但是对于像`

这样的std::runtime_error这样简单的东西
Person(int _age)
{
    if (_age == -1)
    {
        throw std::runtime_error("You have to specify person's age");
        // do not new an exception. It's hard to clean up and free the memory
    }
    age = _age; // why assign then test? Save a clock cycle.
}

并在main

int main(void)
{
    try
    { 
        Person a();
        // use a
        return 0;
    }
    catch (const std::exception & e) // where possible catch by constant reference
    {
        cout << e.what() << endl;
        return -1;
    }
}