【问题标题】:C++ How to define static member, which class has private constructor?C++如何定义静态成员,哪个类有私有构造函数?
【发布时间】:2013-10-27 21:07:00
【问题描述】:

我试图在 C++ 中模仿 Java 枚举,所以我创建了如下所示的代码(当然我删除了与我的问题无关的任何内容):

我的枚举.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 的静态成员。如何定义它们?

我的枚举.cpp

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

这给了我

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

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

【问题讨论】:

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


【解决方案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;
}

【讨论】:

    【解决方案2】:

    首先回答你的问题:

    中的正确文字
    MyEnum.cpp
    

    是:

    MyEnum::Value1 MyEnum::VALUE1;
    

    但这仍然行不通,因为您不会自动成为您父母的朋友。所以还要加

    friend class MyEnum;
    

    class MyEnum::Value1的声明中

    【讨论】:

      【解决方案3】:

      将某些东西声明为私有意味着只有类成员本身和朋友可以访问它,而不是它的基类,也不是它的子类。因此,通过将构造函数声明为私有,可以防止从类及其朋友之外的任何地方进行实例化。 如果您真的希望 MyEnum 访问其子项的私有成员,则必须将其定义为每个子项中的朋友:

      friend class MyEnum;
      

      【讨论】:

        猜你喜欢
        • 2017-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-22
        • 2014-06-13
        • 2013-01-19
        • 2012-07-02
        • 1970-01-01
        相关资源
        最近更新 更多