我有一个double函数,通常返回变量的新值,但有时我不想更改变量,我想通过返回一个特殊值来表示,例如void。这可能吗?
例如:
double GetNewValue(int feature) {
switch( feature ) {
case TYPE1:
return void; // or maybe use return; here?
case TYPE2:
return 2.343;
default:
return featureDefaultValue;
}
}
PS:我知道我可以使用NaN,但我已经将它用作具有其他含义的有效值(还没有数字可用)。
/编辑:谢谢大家的答案,这3个答案都适用于我的问题,并且都同样有效。我现在正在努力选择我将要使用哪一个(我会接受的那个,但我希望我能接受它们!)。
答案 0 :(得分:5)
在这种情况下,您需要从函数返回两个东西,而不是一个。一种常见的方法是使用指向返回值的指针,并返回yes / no标志以指示实际double
的有效性:
int GetNewValue(double *res, int feature) {
switch( feature ) {
case TYPE1:
return 0; // no change to res
case TYPE2:
*res = 2.343;
return 1;
default:
*res = featureDefaultValue;
return 1;
}
现在而不是这样做
double res = GetNewValue(myFeature);
您的函数的用户需要这样做:
double res;
if (GetNewValue(&res, myFeature)) {
// use res here - it's valid
} else {
// do not use res here - it's not been set
}
答案 1 :(得分:4)
一种方法是将结果变量作为指针传递:
void AssignNewValue(int feature, double* result)
{
switch( feature ) {
case TYPE1:
return;
case TYPE2:
*result = 2.343;
break;
default:
*result = featureDefaultValue;
break;
}
}
用过:
double featureValue = 42.0;
/* ... */
AssignNewValue(feature, &featureValue);
答案 2 :(得分:0)
听起来你想要一个“可选”的返回参数。您似乎(并且正确地)想要使用0.0作为“无值”结果,因为这意味着0.0不能用于实际值。
有时您会看到2个好的解决方案是使用“结果代码”,或者使用指针作为返回结果。 (指针更复杂)。我先从#1开始:
// definitions for result codes
#define FAIL 0
#define OK 1
int GetNewValue(int feature, double *result) {
switch( feature ) {
case TYPE1:
*result = 0.0 ;
return FAIL ; // caller of the function should recognize
// the call "failed"
case TYPE2:
*result = 200.0 ;
return OK ;
default:
*result = 47.0 ;
return OK;
}
}
// use:
double feature ;
int result = GetNewValue( 5, &feature ) ;
if( result == OK )
{
// do something with "feature"
}
double* GetNewValue(int feature) {
switch( feature ) {
case TYPE1:
return NULL ; // NO POINTER means FAIL
case TYPE2:
return new double(200) ;
default:
return new double( 47 ) ;
}
}
// use:
double* result = GetNewValue( 5 ) ;
if( result != NULL )
{
// result had a value, so you can use it
}
指针的问题是你需要记住delete
result
delete result ; // when done with pointer that was created
// with `new`, you must `delete` it after
// otherwise you'll get a memory leak