检查构造函数参数

时间:2011-09-09 11:39:32

标签: c++

class item
{
    int i;

  public:
    item(int no) {

    }
};

我想检查构造函数参数。如果发现它保持负值,则应停止创建对象。

此处不能使用例外,因为目标系统不支持例外。

6 个答案:

答案 0 :(得分:5)

没有投掷就无法停止创建对象。您可以做的最好的事情是设置一个“无效参数”标志,然后你必须检查它,如果是,则不使用它就丢弃该对象。

根据您的要求,使用工厂方法创建对象可能会更好 - 这样,您可以在调用构造函数之前进行检查:

class item
{
    int i;
public:
    static item* create(int no) {
        if (no < 0) {
            return 0;
        }

        return new item(no);
    }

private:
    item(int no) {

    }
};

你可以像

一样使用它
item* myItem = item::create(-5);
if(!myItem) {
    // failed
}

但是,这会强制您在堆上分配所有item个实例。

答案 1 :(得分:3)

例外是标准指定执行此任务的方式;没有其他方法可以完全中止对象的创建。

另一方面,您可以为您的类指定一个“状态”成员,该成员指定该类未正确构造,并在每次方法调用时检查它(有点像iostream类的工作方式)。

class item
{
    int i;
    bool validState;
public:
    item(int no) : validState(true)
    {
        if(/* no is invalid */)
        {
            validState = false;
            return;
        }
        /* ... */
    }

    bool ValidState() { return validState; }

    SomeType DoSomething()
    {
        if(!ValidState())
        {
            // do nothing/report the error to the caller
        }
        // ...
    }
}

IMO很麻烦,但是如果你没有例外并想通过公共构造函数创建对象,那就没有比这更好的了。

答案 2 :(得分:2)

您无法在中途停止对象构建,而不会抛出异常。 也就是说,通过将前提条件和对象创建职责移动到单独的工厂函数,并使构造函数成为私有(禁止所有其他方式构造对象),您可以直接阻止构造不符合前提条件的项目对象:

class item {
       int i;

   public:
       static item* create( int no )
       { 
           return no < 0 ? NULL : new item( no );
       }

   private:
       item() { ... }
       item( int no ) { ... }
};

答案 3 :(得分:1)

三个选项。

  1. 在班级中使用旗帜跟踪完整构造 - 但您必须在每种方法中对其进行测试。
  2. 使item成为一个包装器,这样内部会被保存在一个类中,如果参数是好的,那么在所有方法中,你将不得不测试内部 - 所以没有区别于1反正。
  3. 如果参数良好,请使用工厂返回智能指针。
  4. 我在这种情况下的偏好是最后一个。

答案 4 :(得分:0)

将对象置于错误状态(使用布尔值),然后所有方法都应该返回错误。

class Item
{
   int i;
   bool errorState;
   public:
      Item(int n) : i(n) {
         errorState = i < 0;
      }
      bool method()
      {
        if (errorState) return false;
         ..... do stuff here

         return true;
      }
}

答案 5 :(得分:-1)

您可以在编译时执行此操作,并打开必要的警告标记(例如,gcc中的-Wall)。

class item
{
public:
    item(unsigned int no) {}  // item takes only +ve value
};

如果传递了-ve ,编译器会发出警告。