我正在尝试用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();
};
我将costructors设为私有,因此唯一的枚举值实例是BaseEnum的静态成员。如何定义它们?
MyEnum.cpp
MyEnum::Value1 VALUE1=MyEnum::Value1();
这给了我
error: calling a private constructor of class 'MyEnum::Value1'
编辑: 这太简单了。我只是忘了将MyEnym ::添加到值中。从Java回归C ++时遇到的许多小问题之一。此外,在我的问题的代码中,我忘了添加朋友声明,这是在我的原始代码中。谢谢你的回答。
答案 0 :(得分: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;
}
答案 1 :(得分:0)
首先回答你的问题:
中的正确文字MyEnum.cpp
是:
MyEnum::Value1 MyEnum::VALUE1;
但这仍然行不通,因为你不是父母的朋友。所以还要添加
friend class MyEnum;
在class MyEnum::Value1
答案 2 :(得分:0)
将某些内容声明为私有意味着只有类成员本身和朋友才能访问它,而不是它的基类,也不能访问它的子类。因此,通过将构造函数声明为private,可以防止除了类及其朋友之外的任何地方的实例化。 如果您真的希望MyEnum访问其子女的私人成员,您必须将其定义为每个人的朋友:
friend class MyEnum;