我试图在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();
};
我将协结构体设为私有,以便枚举值的唯一实例是 BaseEne 的静态成员。如何定义它们?
迈努姆.cpp
MyEnum::Value1 VALUE1=MyEnum::Value1();
这给了我
error: calling a private constructor of class 'MyEnum::Value1'
编辑:这太简单了。我只是忘了将MyEnym::添加到值中。我从 Java 回到C++时遇到的许多日常小问题之一。另外,在我的问题的代码中,我忘了添加朋友声明,这是我的原始代码。感谢您的回答。
假设你不使用 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;
}
首先回答您的问题:正确的文本
MyEnum.cpp
是:
MyEnum::Value1 MyEnum::VALUE1;
但这仍然行不通,因为你不会自动成为你父母的朋友。所以还要添加
friend class MyEnum;
在class MyEnum::Value1
宣言中
将某些内容声明为私有意味着只有类成员本身和朋友才能访问它,而不是它的基类,也不能访问它的子类。因此,通过将构造函数声明为 private,可以防止从类及其友元以外的任何位置进行实例化。如果你真的希望MyEnum访问其子项的私人成员,则必须将其定义为每个子项中的好友:
friend class MyEnum;