2017-10-02 11 views
0

プログラムでエラーが発生しました。明らかに私は文法について何か不明です。以下のC++コードのスニペットはエラーを生成する最小のものです。親クラスから列挙型にアクセスする構文

#include <iostream> 
using namespace std; 

class Parent 
{ 
    public: 
    enum MyEnum { 
     Value1, 
     Value2, 
     Value3 
    }; 

    MyEnum* set; 
}; 

class Child: public Parent 
{ 
    public: 
    Child() 
    { 
     set = new MyEnum[5]; 
     set[0]=MyEnum.Value1;//<--Something wrong here 
     set[1]=MyEnum.Value2;//<--Something wrong here 
     set[2]=MyEnum.Value3;//<--Something wrong here 
     set[3]=MyEnum.Value2;//<--Something wrong here 
     set[4]=MyEnum.Value1;//<--Something wrong here 
    } 

    void Write() 
    { 
     for(int i=0;i<5;i++) 
     { 
      cout<< "This is " << i << ": " << set[i]; 
     } 
    } 
}; 

int main() { 
    Child c; 
    c.Write(); 

    return 0; 
} 

エラーは、指定された構文と関係があります。

expected primary-expression before ‘.’ token 

は、私がParent.MyEnum.Value1、親:: MyEnum.Value1、などを試してみましたが、何が正しいように思いません。親クラスの特定の値をどのように参照する必要がありますか?

+0

'MyEnum.Value1; // < - 何か間違っています.' - 構文。あなたが通常の列挙型を持っているならば、ちょうど 'Value1'です。 [良い本を選んでください](https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)、それはそれ以上のことを教えてくれるでしょう。 – StoryTeller

+1

質問があるので、誰かが初心者か読んでいると推測したいと思う人はどうですか?私は3つのC++の本を手に入れることはできません。ありがとうございました。質問に戻ると、その構文はなぜ受け入れられますか?そして、正確には「通常のenum」は何ですか?異なる種類の列挙型はありますか? – BSD

+2

あなたの3冊の本はスコープとスコープのない列挙についてあなたに教えてくれませんでしたか? – StoryTeller

答えて

3

列挙型は、あなたがこのようにそれらにアクセスする必要がある意味、それらの値のための資格を必要としません:あなたは資格を強制したい場合

set[0] = Parent::Value1; 

、あなたは強く型付けされた列挙型にを使用することができます。

enum struct MyEnum { 
    Value1, 
    Value2, 
    Value3 
}; 

set[0] = Parent::MyEnum::Value1; 

をしかし、その後、あなたは例えば、明示的なキャストを使用して印刷する必要があります:それはこのようになります

enum
cout << static_cast<int>(set[0]) << endl; 
1

は、classのように、スコープを定義します。あなたのような通常の列挙型は、列挙子の名前をそれ自身の有効範囲とその包含範囲の両方に入れます。 これは、メンバーのアクセスではなく、スコープの解決であるため、.の代わりに::を使用します。したがってParent::Value1,Value1(とprotectedの名前はChildに表示されるため、Parent::MyEnum::Value1またはMyEnum::Value1)を使用することができます。

最初または2つのオプションを許可しない場合は、enumの代わりにenum classを使用する必要があります。

+0

スコープ付きの列挙型のみスコープを定義します。それが彼らが言語に追加された理由です。スコープのない列挙では、 'MyEnum :: Value1'はMSVCの拡張機能としてのみ機能します。 – StoryTeller

+0

@StoryTeller私はそれを許可するものは見つけられませんでしたが、[gccで動作します](https://godbolt.org/g/3jtSkC)と[clang](https://godbolt.org/g/x1QukD)で'-std = C++ 11 -Wall -Wextra -pedantic'です。 '-std'フラグを含めないと、' clang'はC++ 11からのものだと言います。 –

+0

@StoryTeller最後の例[here](http://en.cppreference.com/w/cpp/language/enum#Unscoped_enumeration)のコードコメントによれば、これは機能します。私はまだ標準を見ていませんが、コンパイラが言うように私はそれを暫定的に信じています。 –

関連する問題