有没有办法阻止构造函数中的对象构造?

时间:2015-07-22 05:26:04

标签: c++ constructor destroy

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?。 有没有办法毫无例外地做到这一点? 有没有一种方法可以让构造函数检查参数本身并破坏它自己?

4 个答案:

答案 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语义还没有达到目标:)