2015-09-05 57 views
0

我正在嘗試製作一個小型撲克程序。我在這裏有一個小問題。我的枚舉如何保持字符串而不是char?如何在枚舉中保存字符串?

#include <iostream> 
#include <cstdlib> 
#include <ctime> 
#include <string> 

using namespace std; 
enum mark{Hearts="Hearts",Diamonds='D', Spades='S', Clubs='C'}; 
char cards[5]; 
string marks[5]; 

int main() 
{ 
    srand(time(NULL)); 
    cout<<"Welcome to the Classic Poker!\n"; 
    cards[0]='4'; 
    marks[0]=Hearts; 
    cout<<"cards[0]="<<cards[0]<<endl; 
    cout<<"marks[0]="<<marks[0]<<endl; 
} 

在這一點上給了我一個編譯器錯誤:「的main.cpp | 7 |錯誤:對‘心’的枚舉值不是一個整數常量|」。

+2

你不能做到這一點。枚舉必須包含整型。 – dman2306

+0

謝謝!我雖然做錯了事。所以我必須找到另一種方法來解決這個問題。 – AleksandarAngelov

+0

您可能需要[this]這樣的東西(http://stackoverflow.com/questions/3342726/c-print-out-enum-value-as-text)。 –

回答

2

這根本不可能,枚舉器是一個積分。

你可以很容易做的,但是,是構建一個簡單的功能,每個枚舉爲一個字符串關聯:

enum mark { Hearts, Diamonds, Spades, Clubs }; 

std::string to_string(mark const m) { 
    switch (m) { 
    case Hearts: return "Hearts"; 
    case Diamonds: return "Diamonds"; 
    case Spades: return "Spades"; 
    case Clubs: return "Clubs"; 
    } 
    throw std::runtime_error("Unknown value"); 
} 
+0

這是我意識到我無法在枚舉中使用字符串之後。不幸的是,由於我的聲譽,我無法投票,但它是有幫助的。 – AleksandarAngelov

+0

@AleksandarAngelov:不要擔心,我已經知道如何處理,只要你對網站有貢獻,你很快就會發現自己足夠做任何事情。 –

+0

現在我有15個聲望,我給你投票,我還沒有忘記你做了什麼 – AleksandarAngelov

2

你不能。你可以做的是初始化一個字符串數組,並使用枚舉類型來索引它。 請注意,我也改變痕枚舉類型(我相信這是你的意思,所以它需要後枚舉被定義,還是應該使用typedef。

#include <iostream> 
#include <cstdlib> 
#include <ctime> 
#include <string> 

using namespace std; 
enum mark{Hearts=0,Diamonds, Spades, Clubs} marks[5]; 
string mark_names[4] = {"Hearts","Diamonds", "Spades", "Clubs"}; 
char cards[5]; 

int main() 
{ 
    srand(time(NULL)); 
    cout<<"Welcome to the Classic Poker!\n"; 
    cards[0]='4'; 
    marks[0]=Hearts; 
    cout<<"cards[0]="<<cards[0]<<endl; 
    cout<<"marks[0]="<<mark_names[marks[0]]<<endl; 
} 

現在,如果你不「t等輸入名稱兩次,你願意做一些宏觀的技巧,這裏是一個整潔的選項 - 在外部文件中定義的名稱,包括他們是這樣的:

enum mark{ 
#define DEF_MARK(a) a, 
#include "marks.def" 
} marks[5]; 

string mark_names[4] = { 
#define DEF_MARK(a) #a, 
#include "marks.def" 
}; 

其中marks.def是:

DEF_MARK(Hearts) 
DEF_MARK(Diamonds) 
DEF_MARK(Spades) 
DEF_MARK(Clubs) 
#undef DEF_MARK 

我建議的最後一個改進是添加最後一個DEF_MARK(MAX_MARK),然後在程序中使用MAX_MARK作爲數組大小(而不是討厭的硬編碼4)

+1

注意:宏觀策略也被稱爲「X宏」,https://en.wikipedia.org/wiki/X_Macro –

+0

我對這個發展仍然陌生,現在我會盡量避免這些宏觀伎倆。但他們似乎很有用。 – AleksandarAngelov