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



我试图在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;

最新更新