2013-05-06 115 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