2014-12-19 74 views
0
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) 
    }; 
}; 

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

回答

6

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) 
}; 
1

,但如果你愿意,你可以用一个静态函数做到这一点:

的确在变化在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]; 
    } 
};