初始化私有成员静态常量数组
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)
};
};
我想直接在类声明中初始化静态常量 BDTNode fv_nodes数组,因为 C++11 允许这样做。但是我得到"C2864:'MyClass::fv_nodes':具有类内初始值设定项的静态数据成员必须具有非易失常量积分"。而且我不能在类外初始化它,因为在这种情况下,"BDTNode"类将无法访问。那么我应该怎么做呢?
C++11允许这样做
不,C++11 不允许这样做。您可能正在考虑非静态成员初始化器,允许将其作为构造函数中初始化的替代方法。
对于静态成员,规则没有太大变化。类内声明不是定义,除非它是非易失性 const 整数或枚举类型并且未使用 odr,否则它需要在类外部使用单个定义。如果您提供初始化器,则继续定义。
而且我不能在类外初始化它,因为在这种情况下,"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];
}
};
相关文章:
- C++常量数组的编译时间较长
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 使用双指针传递 2D 常量数组
- 检查输入 std::array 指针数据是否等于某个常量数组
- 如何在可执行文件中存储常量数组?
- 常量数组如何在每个元素中只能包含字符,而 char* 数组能够指向每个元素中的字符串?
- LLVM 无法将数组类型强制转换为常量数组
- 如何在C++中的单行中返回常量数组中的值
- C++ 具有常量数组和initializer_list的重载构造函数
- 在可变参数构造函数中初始化常量数组
- 非常量数组
- C/C++ 中的常量数组和静态常量数组有什么区别
- C++全局常量数组:是否保证合并(优化)到一个副本中
- 在常量数组上使用指针遍历
- 具有函数指针常量数组的 C++ 模板化静态类
- 字符常量数组为空,即使已为其赋值 [C++]
- 指向常量数组的指针
- 函数指针的常量数组令人困惑
- 在 c++ 中初始化静态常量数组
- 常量数组类成员初始化