所以,我想限制在没有使用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;
}
答案 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;
}
}