2014-01-20 161 views
1

我反倒在C++枚舉:打印枚舉作爲字符串

class myClass 
{ 
public: 
    enum ExampleType 
    { 
     TEST1 
     TEST2 
     TEST3 
     TEST4 
    } 
}; 

我想打印的枚舉不是數量而是作爲字符串.. 其實它打印0 .. 1 .. 2 .. 3 我想它打印TEST1TEST2等等

我已經嘗試切換情況下:

std::string type; 
    switch (this->type) 
    { 
    case 0: type = "TEST1"; 
    case 1: type = "TEST2"; 
    case 2: type = "TEST3"; 
    case 3: type = "TEST4"; 
    } 

然後打印類型,但他不去正確的情況下..

怎麼可能?

+4

在'case'中的每個賦值之後添加一個'break;'。 – Gene

+0

Thx Gene,我的不好,第一次使用開關盒 – Laykker

回答

3

在C/C++中,case的陳述落空了。您必須使用break來退出switch語句。如果您this->type爲0,則執行該代碼:

type = "TEST1"; 
type = "TEST2"; 
type = "TEST3"; 
type = "TEST4"; 

你想要的是:

switch(this->type) 
{ 
case TEST1: type = "TEST1"; 
      break; 
case TEST2: type = "TEST2"; 
      break; 
//... 
} 

或者,如果您有返回該值的功能,簡單的返回值:

std::string type_string() 
{ 
    switch(this->type) 
    { 
    case TEST1: return "TEST1"; 
    case TEST2: return "TEST2"; 
    //... 
    default: return std::string::empty(); 
    } 
} 

注:(由於@ DoxyLover的評論),我改變了開關使用聲明枚舉常量,你應該使用這些。如果有人在枚舉的開頭添加了TEST0,那麼switch語句仍然會正​​確執行,而您的版本不會。

+0

另外,使用枚舉值的情況:case TEST1:'而不是case 0:' – DoxyLover

1

在switch-case語句中,評估是在案例之間進行的。這就是從if-else中唯一的關鍵字「else」確保只選擇一組指令的原因。在每個案例的最後添加一箇中斷,以防止這是一種好的做法。

1

如果你知道你想在編譯時打印的東西,你可以使用這樣的預處理:

代碼

#define STRINGIFY(word) (#word) 

int main(void) 
{ 
    printf("%d %s\n", TEST2, STRINGIFY(TEST2)); 

    return 0; 
} 

輸出

1 TEST2

大,但

然而,這是不是這樣做實在沒有什麼不同:

printf("%d TEST2\n", TEST2); 
+0

哇,好方法。謝謝 ! – Laykker

+0

@Laykker這可能不是你想要的。查看我的更新。 –

2

除了其他的答案,你也可以做這樣的事情:(C99)

#include <ansi_c.h> 

enum ExampleType 
{ 
    TEST1, 
    TEST2, 
    TEST3, 
    TEST4, 
    TEST_MAX 
}; 

const char string[TEST_MAX][10]={"TEST1","TEST2","TEST3","TEST4"}; 


int main(void) 
{ 
    int i; 
    for(i=0;i<TEST_MAX;i++) 
    { 
     printf("%d: %s\n", i, string[i]); 
    } 

    return 0; 
} 
+0

地獄是的,工作太多了,有這麼多的可能性! – Laykker

+0

大多數時候有不止一種方法來給貓皮。 (或者如果你願意,可以減少一些可怕的事情) – ryyker