2013-05-06 116 views
1

我有一个函数,它是一个双精度值,通常返回一个变量的新值,但有时候我不想改变这个变量,我想通过返回一个特殊的值来表示这个值,例如void。那可能吗?从双重函数返回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个答案都适用于我的问题,都是同样有效的。我现在正在努力选择我将要使用哪一个(这将是我将接受的一个,但我希望我能接受它们!)。要做到这一点

+1

你可以使用'NaN'。 'void'是没有意义的,因为它类似于类型,而不是值。 – CodesInChaos 2013-05-06 15:26:28

+0

但是,我该如何检查它?是否可能影响一个变量并检查返回的值是否为空? – gaborous 2013-05-06 15:27:22

+0

btw。有许多不同的NaN。原则上你可以使用不同的NaN来表达不同的意思,但这可能是一个坏主意。 – CodesInChaos 2013-05-06 15:28:03

回答

5

在这种情况下,你需要从一个函数返回两件事情,不是一个。这样做的一种常见方法是采用指针到返回的值,并返回一个是/否标志,表示实际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 
} 
+0

我接受这个答案,因为在我的情况下,我已经分开GetNewValue()函数和SetNewValue()函数(后者只修改值,如果GetNewValue()返回的东西),所以它更干净,使用这种方法。我唯一的遗憾是,其他用户将不得不总是添加一个合适的return语句(我想尽量减少复杂性的最大限度),但这是这个实现的一个小缺点,比在我的情况下使用指针更清晰。 – gaborous 2013-05-06 15:51:02

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); 
+0

与刚回来的双人房有什么不同? – bobobobo 2013-05-06 15:35:44

+0

我不认为我已经把它作为一个“读者的练习”......但是如果调用者传递TYPE1,那么'featureValue'的值将被保留。因此,这不仅仅是返回一个双。 – user7116 2013-05-06 15:36:56

+0

是的,它确实保留了*结果的旧值。但它没有告诉调用者发生了什么,没有结果代码。 – bobobobo 2013-05-06 15:37:56

0

这听起来像你想要一个“可选”返回参数。您似乎(并且正确地)将0.0用作“无值”结果,因为这意味着0.0不能用于实际值。

您有时看到的两个很好的解决方案是使用“结果代码”,或使用指针作为返回结果。 (指针更复杂)。我会用#1先启动:

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" 
} 

2.使用指针

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 
} 

与指针的小问题,就是你需要记住的deleteresult

delete result ; // when done with pointer that was created 
       // with `new`, you must `delete` it after 
       // otherwise you'll get a memory leak 
+0

非常好的答案,特别是使用指针的第二种方法,它除了值之外还需要返回另一个值,但由于当前项目的指导原则,我不能使用指针。但是我会在书中保留这个方法,谢谢! – gaborous 2013-05-06 15:52:52