2013-10-27 75 views
0

我试图模仿Java的枚举在C++,所以我创建的代码看起来像这样的(当然我删除任何东西,这不是我的相关问题):C++如何定义静态成员,哪个类有私有构造函数?

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(); 
}; 

我使得构造函数是私有的,这样枚举值的唯一实例就是BaseEnum的静态成员。如何定义它们?

MyEnum.cpp

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

这给了我

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

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

+1

这不是容易切片对象? http://en.wikipedia.org/wiki/Object_slicing – 2013-10-27 21:30:14

回答

0

首先回答你的问题:正确的文本

MyEnum.cpp 

是:

MyEnum::Value1 MyEnum::VALUE1; 

但是,这仍然是行不通的,因为你不是自动的朋友,你的家长。所以也是在class MyEnum::Value1

0

声明事物的声明中加入

friend class MyEnum; 

为私有意味着只有类成员本身和朋友有机会获得它,而不是它的基类,还是其子女。因此,通过声明构造函数是私有的,可以防止从类和其朋友的任何地方实例化。 如果你真的想MyEnum访问其子女的私有成员,你必须把它定义为一个朋友中的每个人:

friend class MyEnum; 
1

假如你不使用C++ 11做的,这里的解决方案 - 让班朋友互相认识,使枚举类可以实例化的子类,子类也可以调用基类的构造函数,我还添加了缺失的部分,以使代码编译:

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; 
} 
相关问题