0

私は C++ で Java 列挙型を模倣しようとしているので、次のようなコードを作成しました (もちろん、質問に関係のないものはすべて削除しました)。

MyEnum.hpp

MyEnum
{
public:
    class Value1;
    class Value2;

    static Value1 VALUE1;
    static Value2 VALUE2;

private:
    MyEnum(std::string name);
};

class MyEnum::Value1 public MyEnum
{
private:
    Value1();
};

class MyEnum::Value2: public MyEnum
{
private:
    Value2();
};

enum 値の唯一のインスタンスが BaseEnum の静的メンバーになるように、コンストラクターを非公開にしました。それらを定義する方法は?

MyEnum.cpp

MyEnum::Value1 VALUE1=MyEnum::Value1();

これは私に与えます

error: calling a private constructor of class 'MyEnum::Value1'

編集:それは単純すぎました。MyEnym:: を値に追加するのを忘れました。Java から C++ に戻ったときに遭遇する多くの小さな問題の 1 つです。また、私の質問のコードでは、元のコードにあったフレンド宣言を追加するのを忘れていました。回答ありがとうございます。

4

3 に答える 3

1

C++ 11を使用しないと仮定すると、これが解決策です-クラスを互いに友達にして、Enumクラスがサブクラスをインスタンス化し、サブクラスが基本クラスコンストラクターを呼び出すことができるようにします。コードを作成するために不足している部分も追加しましたコンパイル可能:

class MyEnum
{
public:
    class Value1;
    class Value2;

    friend class Value1;
    friend class Value2;

    static Value1 VALUE1;
    static Value2 VALUE2;

private:
    MyEnum(std::string name) {}
};

class MyEnum::Value1 : public MyEnum
{
    friend class MyEnum;
private:
    Value1() : MyEnum("VALUE1") {}
};

class MyEnum::Value2 : public MyEnum
{
    friend class MyEnum;
private:
    Value2() : MyEnum("VALUE2") {}
};

MyEnum::Value1 MyEnum::VALUE1;
MyEnum::Value2 MyEnum::VALUE2;

int main()
{
    // Use statuc enum value
    MyEnum::Value1 &someValue = MyEnum::VALUE1;

    return 0;
}
于 2013-10-27T21:24:01.863 に答える
0

まず第一に、あなたの質問に答えてください: の正しいテキスト

MyEnum.cpp

は:

MyEnum::Value1 MyEnum::VALUE1;

しかし、これでもうまくいきません。自動的に親の友達になるわけではないからです。なので追加も

friend class MyEnum;

の宣言でclass MyEnum::Value1

于 2013-10-27T21:18:37.730 に答える
0

何かをプライベートとして宣言することは、クラス メンバー自体とその友人のみがそのクラスにアクセスでき、その基本クラスやその子にはアクセスできないことを意味します。したがって、コンストラクターをプライベートに宣言することで、クラスとそのフレンド以外からのインスタンス化を防止できます。MyEnum にその子のプライベート メンバーにアクセスさせたい場合は、それぞれのメンバー内でそれをフレンドとして定義する必要があります。

friend class MyEnum;
于 2013-10-27T21:21:02.707 に答える