0

我试图在 C++ 中模仿 Java 枚举,所以我创建了如下所示的代码(当然,我删除了与我的问题无关的任何内容):

我的枚举.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();
};

我将构造函数设为私有,因此枚举值的唯一实例是 BaseEnum 的静态成员。如何定义它们?

我的枚举.cpp

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

这给了我

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

编辑:那太简单了。我刚刚忘记将 MyEnym:: 添加到值中。我从 Java 回到 C++ 时遇到的许多日常小问题之一。另外,在我的问题代码中,我忘记添加朋友声明,这是我的原始代码中的。感谢您的回答。

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 回答