5

作業中のクラスに列挙型を使用しています。Google を使用して例を探し、列挙型を正しく使用していることを確認しています。MSDN サイトを含むいくつかのサイトに行きましたが、列挙型はプライベートではなくパブリックにリストされています。データメンバーはプライベートだといつも思っていました。私はベースから外れていますか? もしそうなら、なぜですか?

4

4 に答える 4

18

列挙型は型であり、データメンバーではありません。クラスのユーザーがそれについて知る必要がある場合は、公開する必要があります。それ以外の場合は、プライベートにします。ユーザーがそれについて知る必要がある典型的な状況は、それがパブリックメンバー関数への引数のタイプとして使用される場合です。

于 2012-08-14T16:39:10.153 に答える
4

列挙型はデータ メンバーではなく、定数/型です。それらをパブリックにしない場合、他のクラスは、enum列挙名を使用して定義されているクラスと対話できません。

class A {
  public:
    void func(enumtype e) { if (e == e1) dostuff(); }
  private:
    typedef enum {e1, e2} enumtype;
};

int main() {
  A a;
  a.func(e1); // error: enumtype is private, e1 is not visible here
  return 0;
}
于 2012-08-14T16:42:49.343 に答える
3

これらの列挙型は、おそらくクラス インターフェイスで使用されますよね? そうでなければ、それらを保持する方が確かにきれいですprivate

于 2012-08-14T16:39:26.580 に答える
1

公開enumデータは、テンプレート メタプログラミングで頻繁に使用されます ( Boost.MPLを参照) 。

#include <iostream>

template <int N>
struct Factorial {
    enum { value = N * Factorial<N - 1>::value };
};

template <>
struct Factorial<0> {
    enum { value = 1 };
};

int main()
{
    auto const f10 = Factorial<10>::value; // done at compile-time
    std::cout << f10 << "\n";              // prints 3628800

    return 0;
}

Ideoneに出力します。ここで公に使用されている理由enumは、構造体が中間計算を最上位の呼び出し元に転送するための単純な手段であり、カプセル化が必要ないためです。structこれは、 が関数スコープとして機能enumし、 が戻り値として機能する、コンパイル時の関数評価の大まかな形式です。

于 2012-08-14T18:41:09.323 に答える