クラスの 1 つのメソッド内で列挙型の完全修飾名を使用しています。しかし、「警告 C4482: 非標準の拡張子が使用されています: enum 'Foo' が修飾名で使用されています」というコンパイラ警告が表示されます。C++ では、修飾名なしで列挙型を使用する必要がありますか? しかし、IMO、それは醜く見えます。
何かご意見は?
クラスの 1 つのメソッド内で列挙型の完全修飾名を使用しています。しかし、「警告 C4482: 非標準の拡張子が使用されています: enum 'Foo' が修飾名で使用されています」というコンパイラ警告が表示されます。C++ では、修飾名なしで列挙型を使用する必要がありますか? しかし、IMO、それは醜く見えます。
何かご意見は?
はい、列挙型は新しい「名前空間」を作成しません。列挙型の値は周囲のスコープで直接利用できます。したがって、次のようになります。
enum sample {
SAMPLE_ONE = 1,
SAMPLE_TWO = 2
};
int main() {
std::cout << "one = " << SAMPLE_ONE << std::endl;
return 0;
}
きれいにするには、次を置き換えます。
enum Fruit {
ORANGE = 0,
BANANA = 1
};
と
namespace Fruit {
enum { //no enum name needed
ORANGE = 0,
BANANA = 1
};
};
...
int f = Fruit::BANANA; //No warning
sth は質問に答えますが、私がいつも列挙型をどのように使用してきたかについては触れていませんでした。それらは多かれ少なかれ数字の名前にすぎませんが、私は常にそれらを使用して、特定の値のみを持つことができる型を定義してきました。
列挙型がクラスの一部である場合、消費者が列挙型参照を明確に識別するのに役立ちます。
class Apple {
enum Variety {
Gala,
GoldenDelicious,
GrannySmith,
Fuji
}
...
};
次に、消費者は、列挙型のインスタンスを宣言し、パラメーターとして渡し、型の 1 つを参照するときにそれらを修飾できます。
unsigned int GetCountOfApples( Apple::Variety appleVariety );
...
fujiCnt = GetCountOfApples( Apple::Fuji );
クラス外の列挙型、または同じクラス内の 2 つの列挙型が必要な場合があり、Poy が持っていたようなことができます。ただし、列挙型を参照することはできないため、名前を付けてください。
namespace Color {
enum ColorEnum {
Blue,
Red,
Black
};
列挙型と値を使用すると、次のように機能します。
Color::ColorEnum firstColor = Color::Blue;
Color::ColorEnum secondColor = Color::Red;
if( firstColor == secondColor )
....
たまたま同じ名前の異なる列挙型が存在する場合、それらは常にその型で修飾されます。次に、ギャンブラーが何を求めているかを処理できます。
BananaColorEnum banCol = BananaColor::Yellow;
TomatoColorEnum tomCol = TomatoColor::Yellow;
はい。概念的には、enum は型とその型の可能な値を定義します。当たり前のようですが、定義enum foo { bar, baz };
してから参照することfoo::baz
は、 を参照することと同じint::1
です。
namespace Company
{
typedef int Value;
enum
{
Microsoft= 0,
APPLE = 1,
};
};
namespace Fruit
{
typedef int Value;
enum
{
ORANGE = 0,
BANANA = 1,
APPLE = 2,
};
};
...
Fruit::Value f = Fruit::BANANA; //No warning
Company::Value f = Company::APPLE; //is different value then Fruit::APPLE
This works on GCC and MS compiler and Mac. And the advantage is that you can use namespace operator and pass conflicts. The little disadvantage is that instead of Fruit, you have to write Fruit::Value. it is more useful in large project when you don't know what enums are in other class.
If it is possible to use C++11 instead, it is much more simple, because the enum::namespace syntax is then possible.
これを行うために私が見つけた最もクリーンな方法は、列挙型をそのように定義することです
namespace Samples
{
enum Value
{
Sample1,
Sample2,
Sample3
};
}
typedef Samples::Value Sample;
次に、関数と変数の定義で typedef を使用できます。
void Function(Sample eSample);
Sample m_eSample;
.cpp ファイルでは、名前空間を使用して変数を割り当てることができます。
void Function(Sample eSample)
{
m_eSample = Samples::Sample1;
eSample = Samples::Sample2;
}
個人的には、これはコンパイラのバグだと思います。私は長い間 C++ を使用してきました。悲しいことに、OP にサンプル コードはありません。Javaの人々による列挙型の解釈は、実際には正しいiMOでした。わたくし、こんな感じでした…
class Foo {
enum tMyEnum { eFirstVal = 0, eSecondVal = 1};
// ...
tMyEnum m_myVal;
};
void Foo::MyMethod() {
if(m_myVal == tMyEnum::eFirstVal) {
// ...
}
}
Foo::tMyEnum::eFirstVal も試しました。修飾子なしで、すべてがコンパイルされました。