[英]Initializing private member static const 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;
//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 ++ 11允许这样做
不,C ++ 11不允许这样做。 您可能正在考虑使用非静态成员初始化程序,可以将其作为构造函数中初始化的替代方法。
对于静态成员,规则没有太大变化。 类内声明不是定义,并且除非是非易失性const整数或枚举类型且未使用,否则它在类外需要单个定义。 如果提供了初始化程序,则将继续进行定义。
而且我无法在类外部初始化它,因为在那种情况下,“ BDTNode”类将无法访问。
不,初始化程序在类的范围内,因此可以访问私有名称。 以下对我有用 :
// 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)
};
但是如果您愿意,可以使用静态函数来完成此操作:
这确实在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];
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.