class item
{
int i;
public:
item(int no) {
}
};
我想检查构造函数参数。如果发现它保持负值,则应停止创建对象。
此处不能使用例外,因为目标系统不支持例外。
答案 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)
三个选项。
item
成为一个包装器,这样内部会被保存在一个类中,如果参数是好的,那么在所有方法中,你将不得不测试内部 - 所以没有区别于1反正。我在这种情况下的偏好是最后一个。
答案 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
值,编译器会发出警告。