0

画面にテキストを印刷する単純なクラスを作成していて、テキストの色を変更できるとしましょう。

myclass a("this is the text");
a.setColor("green");

私はまだ C++ を学んでいますが、最近紹介されenumて試してみようと思いました。enum上記のようなインターフェイス関数で型を使用するのが良い方法であるかどうか疑問に思っていましたsetColorか?

enumインターフェイス関数でクラスを使用する利点と欠点は何ですか? それらがより適切な場合と、使用が悪い場合はありますか?

プロパティを結合したい場合はどうすればよいですか? 例えば

a.setAttribute("bold reverse");

インターフェイスが私が説明したいもの、つまり私のクラスのユーザーが最終的に使用する機能の正しい用語であるかどうかはわかりません。

4

3 に答える 3

8

あなたの場合、(少なくとも) 2 つの利点があります。

  • 実行時に文字列を解析する必要がないため、効率が向上します。switch列挙型変数をステートメントで直接使用できます。
  • 列挙型は(ある程度)自己文書化されているため、コードのユーザーは無効な値を提供するために一生懸命働く必要があります。

潜在的な「欠点」の 1 つは、色の文字列が実行時のユーザー入力 (テキスト ボックスなどに入力したもの) などに由来する場合です。この文字列を解析して列挙型に変換する必要があります。ただし、とにかくこれを行う必要があるため、実際には欠点ではありません。ベスト プラクティスは、ユーザー インターフェイス ロジックが文字列を検証し、できるだけ早い機会に列挙型に変換することです。

プロパティを結合したい場合はどうすればよいですか?

少なくとも 3 つのオプションを考えることができます。

  • への複数の呼び出しを使用しますsetAttribute
  • 属性の配列を渡します。
  • 各列挙値を 2 の累乗になるように定義すると、列挙型を と組み合わせることができます|
于 2012-05-23T11:45:01.553 に答える
3

はい、enumこの場合、を使用すると、実際の文字列よりも優れているようです。

明確な利点の 1 つは、強力なタイピングです。

あなたの場合のようにsetColora を受け入れるchar*場合、次のことができます。

 a.setColor("horse");

これは、実行時にエラーとしてのみ検出できます。

as パラメータsetColorを取る場合:eColors

 a.setColor(eGreen);
 a.setColor(eRed);

コンパイルしますが、

 a.setColor(eHorse);

しません。

于 2012-05-23T11:44:40.447 に答える
0

この場合、列挙型は明らかに文字列よりも明示的です。値の連結に関しては、これを機能させるために少し手を加えることができます。列挙型の値を 2 のべき乗で増加するように設定すると、それらを OR できます。

enum TextAttributes {
    Bold = 1,
    Italic = 2,
    Reverse = 4,
    StrikeThrough = 8,
    Underline = 16
};

TextAttributes attr = Bold | Reverse;
于 2012-05-23T11:58:00.197 に答える