3

ベストプラクティスのアドバイスを探しています。次のようにC++で宣言されたクラスがある場合:

class Foo {
public:
    enum { A, B, MAX};
};

列挙型は次のようにアクセスする必要があります:

Foo::A

また

Foo *var; 
var->A;

今日まで、私はFoo::Aクラス型のptrを介してではなく、常にのような定数値にアクセスしていました。実はそれが可能だとは信じていませんでした。各フォームをいつ、どのフォームを使用する必要があるのか​​、または試行錯誤した方法に固執する必要があるのか​​、誰かに出くわしたことがありFoo::Aますか?

編集:FoovarをFoo* varにしたのは、ほとんどの人が感謝を見つけたのでタイプミスでした。

4

3 に答える 3

6

列挙型は、インスタンスではなくクラスに関連付けられています。だからFoo::A良いです。

于 2012-12-04T17:26:19.377 に答える
2

おそらく、あなたの例は、ポインタを宣言するかFoo * var、列挙子にとしてアクセスすることになっていvar.Aます。

使用可能なオブジェクトまたはポインタがない場合は、明らかに「クラス」形式Foo::Aが唯一の賢明なオプションです。

そうした場合、両方の形式は同等です。私の意見では、「クラス」形式は、オブジェクトではなくクラスとの関連付けに一致するため、より表現力があります。それはまた、それが有効であると信じていない人々との議論を救うかもしれません。

状況によっては(たとえば、テンプレート内、またはauto型で宣言されたオブジェクトを使用する場合)、クラス名が複雑になるか、不明になることもあります。その場合、「オブジェクト」形式の方が適しています。

template <typename T>
void f()
{
    typename some::complicated::type::depending_on<T>::type var;
    var.thing = var.A;            // OK
    var.thing = decltype(var)::A; // Ugly, requires C++11
    var.thing = some::complicated::type::depending_on<T>::type::A; // Yuck!
}
于 2012-12-04T17:28:54.253 に答える
1

@ KevinA.Naudeが言ったように、最初のバージョンの方が優れています。スコープを設定する方法を探している場合はenum、C ++ 11を確認することをenum classお勧めします。これにより、スコープを適用するような構成を使用できます。スコープの内部を参照enum class X {A, B, MAX};する必要があります。X::A

于 2012-12-04T17:31:37.530 に答える