2017-08-08 10 views
0

私はC++を使って簡単なテキストベースのポケモンバトルシミュレーターを作っています。今まで私はポケモンクラスとポケモンムーブクラスを持っていて、各クラスには型のメンバ変数があります。ポケモンタイプの列挙定数

今は、文字列を「火」「水」「草」などの文字列として保存していますが、これが情報を保存する最良の方法かどうかは不明です。ダメージボーナス/ペナルティのタイプを比較しなければならず、単純な定数ではなく文字列全体を解析する必要があります。

enumsはより良い選択でしょうか?もしそうなら、私はちょうどこれのような一方/両方のクラスのヘッダーファイルの始めにそれらを通常の方法で宣言しますか?

列挙PKMN_type = {火、水、GRASS、...}

は本当にサイズ/メモリの観点でプログラム効率に測定可能な効果を持っている代わりに、文字列の列挙型を使用しますか?

ありがとうございました。

+1

'enum'を使うと、テキストを' enum'に変換し、 'enum'をテキストに変換する関数を提供することができます。 C++言語は、 'enum'をテキストに変換する機能を提供していません。 –

+0

これらの機能は、私の移動/ポケモンクラスのヘルパー機能であるべきですか?または、私は別の答えで示唆されているように別のenumクラスを作成する必要がありますか? – SMS

+0

変換関数とともに 'enum'を別々のファイルに配置しています。はい、彼らは助けます。カプセル化を促進するクラスでは、時々、私は 'enum'を宣言します。 –

答えて

1

パフォーマンスが重視されないシンプルなプログラムでは、文字列と列挙型を比較す​​ると、(おそらく)は問題になりません。 しかし、列挙型は目的のための文字列と同じように表現できます(になるでしょう)。私はそれらを使用しない理由は何もありません。

Btw;一般的に旧式のを新しいコードでタイプセーフなenum classよりも優先します。

3

を使用すると、コードスピード、タイプの安全性など、いくつかの利点があります。誤ってスチールタイプのポケモンを作成しようとすると、早期に検出できます。

これはC++なので、通常enumではなくenum classにすることをおすすめします。 ポケモンには複数のタイプがあるので、something like FLYING|NORMAL to mean “both FLYING and NORMALがあります。enumenum classよりも簡単に使うことができます。次の2つの異なる電源にそれぞれのタイプを設定することでこれを実現します:

少ないシンプルなアプリケーションで
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

enumクラスを作成する代わりに使用できるC++ライブラリがありますか?私はいくつかのグーグルを行い、std :: mapは有望に見える。しかし、テキストからintおよびint-to-text関数を書く必要なしに、文字列をintに、またはその逆にマッピングすることができますか? – SMS

+0

ビットフィールドが必要ない場合は、通常の 'enum'と同じように作成できますが、代わりに' enum class'を使用して起動できます。もしあなたがそうであれば、[ここ](https://www.justsoftwaresolutions.co.uk/cplusplus/using-enum-classes-as-bitfields.html)は 'enum class'をビットフィールドとして使うことに関する記事です。それを読んだり、一番下のヘッダファイルにまっすぐにスキップしたりすることができます。 'enum'も' enum class'も文字列変換を行いません。それでも自分でそれを行う必要があります。標準のマップクラスは双方向ではありませんが、なぜ文字列を列挙型の値に変換したいのですか? –

+0

ありがとうございます。私はストリングとしてポケモンタイプを出力する必要がありますが、ダメージボーナスのためにポケモンタイプとの攻撃タイプを比較します。例えば、ファイア攻撃は芝ポケモンに対して非常に効果的で、より多くのダメージを与えます。あなたの答えで言ったように、1人のキャラクターを使うことには多くの利点があります。だからこそ私は列挙型から文字列へ変換したいのです。逆もまた同じです。 – SMS