繁体   English   中英

初始化私有成员静态const数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM