Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 声明和访问单例类中的枚举-C++;_C++ - Fatal编程技术网

C++ 声明和访问单例类中的枚举-C++;

C++ 声明和访问单例类中的枚举-C++;,c++,C++,C++初学者问题 如果在单例类的公共部分中存在枚举,那么从单例类外部使用枚举值的正确方法是什么 class MySingletonClass { public: static MySingletonClass & Singleton(); enum { eCodeZero = 0, eCodeOne = 1 }MsgQueueCodes; protected

C++初学者问题

如果在单例类的公共部分中存在枚举,那么从单例类外部使用枚举值的正确方法是什么

class MySingletonClass
{
    public:
      static MySingletonClass & Singleton();

      enum
      {
          eCodeZero         = 0,
          eCodeOne      = 1
      }MsgQueueCodes;
    protected:

          MySingletonClass ();
          ~MySingletonClass ();
};
我可以从这个类之外访问这样的枚举值

MySingletonClass::Singleton().eCodeZero
MySingletonClass::Singleton().eCodeOne
我的问题是,

  • 这是正确的方法吗
  • 有没有其他办法
  • 在另一个类中声明枚举变量的语法是什么?[需要执行类似于
    MySingletonClass::MsgQueueCodes myMsgQCode;
    //语法不正确]
  • 谢谢您抽出时间。

    • 如果您的
      enum
      仅与
      MySingletonClass
      相关,则最好在类中声明它。然后您必须在定义类定义之外的函数中使用
      MySingletonClass::eCodeZero
    • 如果相同的
      enum
      在其他一些类中使用,那么最好在类之外使用名称空间声明它
        • 如果您的
          enum
          仅与
          MySingletonClass
          相关,则最好在类中声明它。然后您必须在定义类定义之外的函数中使用
          MySingletonClass::eCodeZero
        • 如果相同的
          enum
          在其他一些类中使用,那么最好在类之外使用名称空间声明它

        代码是有效的,可能是您想要的。请注意,
        MsgQueueCodes
        被声明为(未命名)枚举的成员变量。也许你想要:

        class MySingletonClass
        {
            public:
              static MySingletonClass & Singleton();
        
              enum MsgQueueCodes
              {
                  eCodeZero     = 0,
                  eCodeOne      = 1
              };
            MsgQueueCodes code;
            protected:
        
                  MySingletonClass ();
                  ~MySingletonClass ();
        };
        
        然后你可以写:

        MySingletonClass::MsgQueueCodes code =  MySingletonClass::Singleton().eCodeZero;
        MySingletonClass::MsgQueueCodes code =  MySingletonClass::Singleton().code;
        

        也可以,因为C++ 11,我们有<代码>枚举类< /C> >,这意味着更好的枚举名称范围。例如,见:


        代码是有效的,可能是您想要的。请注意,
        MsgQueueCodes
        被声明为(未命名)枚举的成员变量。也许你想要:

        class MySingletonClass
        {
            public:
              static MySingletonClass & Singleton();
        
              enum MsgQueueCodes
              {
                  eCodeZero     = 0,
                  eCodeOne      = 1
              };
            MsgQueueCodes code;
            protected:
        
                  MySingletonClass ();
                  ~MySingletonClass ();
        };
        
        然后你可以写:

        MySingletonClass::MsgQueueCodes code =  MySingletonClass::Singleton().eCodeZero;
        MySingletonClass::MsgQueueCodes code =  MySingletonClass::Singleton().code;
        

        也可以,因为C++ 11,我们有<代码>枚举类< /C> >,这意味着更好的枚举名称范围。例如,见:


        使用
        MySingletonClass::eCodeZero
        等。。访问。您发布了它,所以使用它=P枚举的decl不是某个实例的一部分(尽管他们可以自然访问它);它是类decl的一部分,因此任何对该类具有适当访问权限的人都可以直接访问枚举,如图所示。通过在类中声明枚举,您试图限制该类中枚举的范围。那么你是想在另一个类中声明enum吗?既然你是初学者,我就这么说:不要养成使用单例的习惯。“他们几乎从来都不是一个好主意。我支持这一点,@JohnZwinck。当你随意使用单例时,你会遇到很多麻烦。事实上,在过去的几年里,我一直在维护一个有着这个问题的大型项目,除了把剩下的时间花在认真地工作上,我几乎无能为力。@paddy:几乎所有关于设计模式的书都说“单例模式是最简单的”。这将是简单的概念。但依我看,在多线程环境中的正确实现并不是微不足道的。我已经看到[尚未阅读]斯科特·迈尔斯(Scott meyers)撰写的数十页关于如何正确执行此操作的文档。请使用
        MySingletonClass::eCodeZero
        等。。访问。您发布了它,所以使用它=P枚举的decl不是某个实例的一部分(尽管他们可以自然访问它);它是类decl的一部分,因此任何对该类具有适当访问权限的人都可以直接访问枚举,如图所示。通过在类中声明枚举,您试图限制该类中枚举的范围。那么你是想在另一个类中声明enum吗?既然你是初学者,我就这么说:不要养成使用单例的习惯。“他们几乎从来都不是一个好主意。我支持这一点,@JohnZwinck。当你随意使用单例时,你会遇到很多麻烦。事实上,在过去的几年里,我一直在维护一个有着这个问题的大型项目,除了把剩下的时间花在认真地工作上,我几乎无能为力。@paddy:几乎所有关于设计模式的书都说“单例模式是最简单的”。这将是简单的概念。但依我看,在多线程环境中的正确实现并不是微不足道的。我已经看到[尚未阅读]斯科特·梅耶斯(Scott meyers)撰写的数十页关于如何正确执行此操作的文档。