是否可以动态初始化静态成员数组

时间:2011-09-17 00:11:40

标签: c++ static-members

关于在C ++中初始化静态成员有很多问题,但我找不到这个。

class Node {

  private:
    static const int INITIAL_SIZE = 100;
    static Node* node_space;
    static int OUT_OF_BOUNDS = 0;
    static Node BAD_NODE;

};

Node* Node::node_space = new Node[Node::INITIAL_SIZE];

这似乎有效,但我也想将BAD_NODE添加到此数组作为第一个元素。

Node Node::BAD_NODE = Node();
Node::node_space[OUT_OF_BOUNDS] = BAD_NODE;

以上不编译。消息是

Node.cpp:7: error: expected constructor, destructor, or type conversion before '=' token

这是针对我们正在实施带有数组的链表的学校项目。

2 个答案:

答案 0 :(得分:1)

你可能想要做的事情,如果你只有一个静态数据对象,但是你想要动态初始化它,就是创建一个单例对象作为Node类的包装器。基本上单例出现的是你创建一个用普通类构造函数初始化的类的单个版本,但构造函数operator=()和复制构造函数被声明为private。然后通过静态变量创建类的单个静态版本,并且有一个公共访问器方法允许代码的其他部分访问单例类(即,访问器返回对静态类的引用或常量引用)你创建了。)

class Node_S
{
    private:

        //your original Node class we're wrapping in the singleton object
        struct Node {
            static const int INITIAL_SIZE = 100;
            static Node* node_space;
            static int OUT_OF_BOUNDS;
            static Node BAD_NODE;
        };

        //private default constructor is only called once
        Node_S()
        {
            //place your original initialization code for Node here
            Node::OUT_OF_BOUNDS = 0;
            Node::node_space = new Node[Node::INITIAL_SIZE];
            Node::BAD_NODE = Node();
            Node::node_space[Node::OUT_OF_BOUNDS] = Node::BAD_NODE;
        }

        //private copy and assignment operator
        Node_S(const Node_S&) {}
        Node_S& operator=(const Node_S&) { return *this; }

    public:

        static Node_S& get_instance() 
        {
            //here is where the single version of Node_S is created
            //at runtime
            static Node_S singleton_instance = Node_S();
            return singleton_instance;
        }

        //... Other public functions
};

现在您可以通过Node_S::get_instance()访问您的单身人士了。由于复制和赋值运算符被声明为private,因此您无法创建单例的额外副本...只会创建此类的单个实例。如果你需要传递它,你可以通过引用来做。此外,没有初始化歧义,因为Node的所有静态元素在调用get_instance()的运行时期间按顺序初始化。由于singleton_instance是一个静态变量,因此构造函数Node_S()运行的次数只有一次,因此您基本上可以将Node的所有初始化代码安全地放在构造函数中。然后,只需添加在Node界面中使用Node_S类型所需的任何其他方法。因此,一些常见的使用代码可能如下所示:

Node_S::Node a_node_copy = Node_S::get_instance().get_node(10);

答案 1 :(得分:1)

在C ++ 11中(即“在C ++中:-)),您可以为数组提供初始化列表:

Node* Node::node_space = new Node[Node::INITIAL_SIZE] { Node::BAD_NODE };

仅当您将第一个元素设置为特定内容时才会有效。初始化列表必须提供元素的初始序列,因此如果OUT_OF_BOUNDS不为零,则不清楚它们是什么。