class Date
{
private:
int Day;
int Month;
int Year;
bool CheckDate(int InputDay, int InputMonth, int InputYear);
// this return true when the date is valid
public:
Date(int InputDay, int InputMonth, int InputYear);
~Date();
};
Date::Date(int InputDay, int InputMonth, int InputYear)
{
if (!CheckDate(InputDay, InputMonth, InputYear))
{
cout << "Date Invalid!\n";
this->~Date();
// this invokes the destructor
// however at the end of the program the destructor would invoke again
}
else
{
Day = InputDay;
Month = InputMonth;
Year = InputYear;
}
}
我在这里找到了一个资源How can object construction of a class be stopped if a parameter passed is found to be wrong?。 有没有办法毫无例外地做到这一点? 有没有一种方法可以让构造函数检查参数本身并破坏它自己?
答案 0 :(得分:0)
我建议这个
Date::Date(int InputDay, int InputMonth, int InputYear) {
if (!CheckDate(InputDay, InputMonth, InputYear))
throw "Date Invalid!\n"; // throw exception
else {
Day = InputDay;
Month = InputMonth;
Year = InputYear;
}
}
另外,使用try-catch
块来捕获异常,并将CheckDate
声明为static
。
答案 1 :(得分:0)
正如Jerry Coffin所说,除了抛出异常之外,没有正确的方法来阻止对象的构建。
唯一的选择是在你的类中有一个布尔值(valid
),调用者应该在创建和删除(或重置或其他)之后测试它,如果它是假的。但它依赖于调用者做正确的事情,而不是在类本身处理错误条件。
异常具有这个特殊值:调用者可以在需要时捕获它们,但如果它不关心,则该异常可确保不能无意中使用构造错误的对象。
答案 2 :(得分:0)
您无法在功能检查日期中调用此 - &gt; ~Date()。 在calss Date函数中,一个类不能在它的函数中解构自己,它只用于类。如果检查失败,你可以抛出异常,不要解构类。
答案 3 :(得分:0)
正如马特所说的提出例外。
在替代方案中,您可以使用指针。
考虑日期类对用户的影响。
...
Date due(a,b,c);
...
如果你中途休息,无法判断到期是否无效。 唯一的方法是抛出异常。
另一种方法(使用unique_ptr包装器)是创建一个函数:
unique_ptr<Date> due=makeDate(d,m,y)
unique_ptr<Date> makeDate(int d,int m,int y)
{
if( CheckDate(d,m,y)) // make your Checkdate function static.
return make_unique<Date>(d,m,y);
else
return make_unique<Date>(nullptr);
}
仔细检查那里的所有内容,我的unique_ptr语义还没有达到目标:)