【问题标题】:Initializing private member static const array初始化私有成员静态常量数组
【发布时间】:2015-02-18 13:52:58
【问题描述】:
class MyClass
{
public:
         ...
private:
    enum class BDTNodeType : unsigned char
    {
        NT_TERMINAL_ZERO,
        NT_TERMINAL_ONE,
        NT_TERMINAL_X,
        NT_NOT_TERMINAL
    };

    class BDTNode
    {
    public:
        explicit BDTNode(BDTNodeType node_type = BDTNodeType::NT_NOT_TERMINAL);
        BDTNode(const BDTNode &node);
        ~BDTNode();

        BDTNodeType type;
        BDTNode *thenPtr;   //1
        BDTNode *elsePtr;   //0
    };

    BDTNode *root_node;

    //Constant nodes
    static const BDTNode fv_nodes[3] = {
        BDTNode(BDTNodeType::NT_TERMINAL_ZERO),
        BDTNode(BDTNodeType::NT_TERMINAL_ONE),
        BDTNode(BDTNodeType::NT_TERMINAL_X)
    };
};

我想直接在类声明中初始化静态 const BDTNode fv_nodes 数组,因为 C++11 允许这样做。但我得到“C2864:'MyClass::fv_nodes':具有类内初始化程序的静态数据成员必须具有非易失性 const 积分”。而且我不能在课外初始化它,因为在这种情况下“BDTNode”类将无法访问。那我该怎么做呢?

【问题讨论】:

    标签: c++ arrays c++11 initialization static-members


    【解决方案1】:

    C++11 允许这样做

    不,C++11 不允许这样做。您可能会想到 非静态 成员初始化器,它们可以作为构造函数中初始化的替代方法。

    对于静态成员,规则没有太大变化。类内声明不是定义,除非它是非易失性 const 整数或枚举类型并且不使用 odr,否则它需要在类外进行单个定义。如果您提供初始化程序,则继续定义。

    而且我不能在类外初始化它,因为在那种情况下“BDTNode”类将无法访问。

    不,初始化程序在类的范围内,因此可以访问私有名称。以下works for me

    // in class
    static const BDTNode fv_nodes[3];
    
    // in a source file
    const MyClass::BDTNode MyClass::fv_nodes[3] = {
        BDTNode(BDTNodeType::NT_TERMINAL_ZERO),
        BDTNode(BDTNodeType::NT_TERMINAL_ONE),
        BDTNode(BDTNodeType::NT_TERMINAL_X)
    };
    

    【讨论】:

      【解决方案2】:

      但如果您愿意,您可以使用静态函数来执行此操作:

      确实在 c++11 中发生了变化,因为它是线程安全的,无需显式使用互斥锁。

      #include <array>
      
      class MyClass
      {
      public:
          //    ...
      private:
          enum class BDTNodeType : unsigned char
          {
              NT_TERMINAL_ZERO,
              NT_TERMINAL_ONE,
              NT_TERMINAL_X,
              NT_NOT_TERMINAL
          };
      
          class BDTNode
          {
          public:
              explicit BDTNode(BDTNodeType node_type = BDTNodeType::NT_NOT_TERMINAL);
              BDTNode(const BDTNode &node);
              ~BDTNode();
      
              BDTNodeType type;
              BDTNode *thenPtr;   //1
              BDTNode *elsePtr;   //0
          };
      
          BDTNode *root_node;
      
          static const std::array<BDTNode, 3>& fv_nodes() {
              static const std::array<BDTNode, 3> _fv_nodes {
                  BDTNode(BDTNodeType::NT_TERMINAL_ZERO),
                  BDTNode(BDTNodeType::NT_TERMINAL_ONE),
                  BDTNode(BDTNodeType::NT_TERMINAL_X)
              };
              return _fv_nodes;
          }
      
          static const BDTNode& fv_node(size_t i) {
              assert(i < 3);
              return fv_nodes()[i];
          }
      };
      

      【讨论】:

        猜你喜欢
        • 2012-02-18
        • 2014-03-31
        • 1970-01-01
        • 2016-10-28
        • 1970-01-01
        • 2012-07-22
        • 1970-01-01
        • 2016-11-29
        • 1970-01-01
        相关资源
        最近更新 更多