2017-08-08 132 views
0

我正在使用C++製作一個簡單的,基於文本的口袋妖怪戰鬥模擬器。到目前爲止,我有一個Pokemon類和一個Pokemon移動類,每個類都有一個類型成員變量。口袋妖怪類型的枚舉常量

現在我將類型存儲爲字符串 - 「火」,「水」,「草」等。但我不確定這是存儲信息的最佳方式,特別是因爲我會必須比較傷害獎金/懲罰的類型,這意味着必須解析整個字符串而不是簡單的常量。

枚舉是更好的選擇嗎?如果是這樣,我只是聲明他們在這樣的一個/兩個類的頭文件的開頭通常的方式?

枚舉PKMN_type = {火,水,草,...}

將使用枚舉的字符串而不是真有大小/存儲器方面對方案的效率可衡量的效果呢?

謝謝。

+1

如果您使用'enum',您可能想要提供從文本轉換爲'enum'和'enum'爲文本的函數。 C++語言不提供將'enum'轉換爲文本的工具。 –

+0

這些函數應該是我的移動/ Pokemon類的輔助函數嗎?還是應該按照其他答案中的建議單獨製作一個枚舉類? – SMS

+0

我一直在將'enum's和轉換函數一起放入單獨的文件中。是的,他們幫助。儘管有時候我會在類中聲明'enum'來促進封裝。 –

回答

1

對於一個簡單的,不是性能關鍵的程序,比較字符串與枚舉可能無關緊要。 但是,因爲枚舉可以像字符串一樣表達您的目的(可能將更快地爲),我沒有看到任何理由不使用它們。

Btw;通常更喜歡在新代碼中的舊式enum上使用類型安全的enum class

3

使用enum s會帶來幾個好處,包括代碼速度,類型安全性,並且確保您在意外嘗試製作盜取類型的Pokémon時檢測它。

既然這是C++,我通常會建議將它製作爲enum class而不僅僅是enum但是,因爲神奇寶貝可以有多種類型,所以你可能喜歡做一些有something like FLYING|NORMAL to mean 「both FLYING and NORMAL的東西,你可以用一個普通的enumenum class更容易做一些事情。您將每種類型設置爲不同的兩個電源實現這一點:

enum pokemon_type { 
    NORMAL = 1, 
    FIRE = 2, 
    FIGHTING = 4, 
    WATER = 8, 
    // ... 
    // Depending on design, a `std::map` might be better, but you could do this: 
    VULNERABLE_TO_FIRE = GRASS | ICE | BUG | STEEL, 
    RESISTANT_TO_FIRE = FIRE | WATER | ROCK, 
    IMMUNE_TO_FIRE = 0, // Nothing is outright immune to fire 
    // ... 
}; 

在較簡單的應用程序,我會建議使用enum class不管怎樣,手動執行相關操作人員。

+0

有沒有可以用來代替製作枚舉類的C++庫?我做了一些谷歌搜索和標準::地圖看起來很有前途。但是,它可以用來將字符串映射到整數,反之亦然,而不需要編寫text-to-int和int-to-text函數? – SMS

+0

如果你不想要位域,你可以像創建一個普通的'enum'那樣創建它,而是用'enum class'來代替它。如果你這樣做,[這裏](https://www.justsoftwaresolutions.co.uk/cplusplus/using-enum-classes-as-bitfields.html)是關於使用'enum class'作爲一個位域的文章;您可以使用閱讀它或直接跳到底部的頭文件。 'enum'和'enum class''都不能進行字符串轉換;你仍然需要自己做。標準映射類不是雙向的,但爲什麼你要從字符串轉換爲枚舉值呢? –

+0

謝謝。我需要輸出口袋妖怪類型作爲字符串,但也比較一個攻擊類型與口袋妖怪類型的傷害獎金 - 例如,火焰攻擊是超級有效的反對草口袋妖怪,並會造成更多的傷害。就像你在答案中所說的那樣,使用單個字符會有很多好處。這就是爲什麼我想從枚舉轉換爲字符串,反之亦然。 – SMS