C ++如何定义静态成员,哪个类有私有构造函数?

时间:2013-10-27 21:07:00

标签: c++ enums static-members private-constructor

我正在尝试用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 ++时遇到的许多小问题之一。此外,在我的问题的代码中,我忘了添加朋友声明,这是在我的原始代码中。谢谢你的回答。

3 个答案:

答案 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;