如何在类中声明和初始化静态成员?

时间:2019-05-13 08:00:40

标签: c++ initialization static-members

当我编译包含以下头文件的代码时,我收到一条错误消息:

Graph.h:22: error: ISO C++ forbids in-class initialization of non-const 
static member `maxNumberOfNeighbors'

如何声明和初始化不是const的静态成员?

这是.h文件

#ifndef GRAPH_H
#define GRAPH_H

typedef char ElementType;
class Graph {
public:
    class Node {
    public:
        static int maxNumberOfNeighbors = 4;;
        int numberOfNeighbors;
        Node * neighbors;
        ElementType data;
        Node();
        Node(ElementType data);
        void addNeighbor(Node node);
    };

typedef Node* NodePtr;

Graph();
void addNode(Node node);
NodePtr getNeighbors(Node node);
bool hasCycle(Node parent);
private:
    NodePtr nodes;
    static int maxNumberOfNodes;
    int numberOfNodes;
};

#endif /* GRAPH_H */

3 个答案:

答案 0 :(得分:5)

最简单的措施是遵循错误消息的建议。如果它抱怨非常量静态变量,请使其为常量。

static int const maxNumberOfNeighbors = 4;

特别考虑它应该是一个常量,无论其名字如何。您不会更改最大值,是吗??

否则,如果要对其进行突变,请仅在类定义之外进行初始化和定义。

// At namespace scope, in one file
int Graph::Node::maxNumberOfNeighbors = 4;

答案 1 :(得分:3)

绝对可以拥有不具备CV资格的类静态成员(非const且不可变)。只是根据当前的ISO C ++规范,当一个人在类中声明它们时,不应该初始化它们(给它们赋值)。比较中,对于自C ++ 11起的非静态数据成员(无论具有CV资格),都可以这样做。

由于静态数据成员不属于任何对象,因此可以通过正确的访问将它们分配给类之外的对象(如果它们不是常量,则可以对其进行操作)(请牢记正确的作用域运算符)。同样,无论公开/私有声明和CV资格如何,都可以在类外部初始化静态数据成员。

所以初始化静态数据成员的一种方法是,在它们的类(子类为外部类)所在的同一块作用域/命名空间中,但不在任何类范围内。

例如:

class Graph {
public:
    class Node {
    public:
        static int maxNumberOfNeighbors;
       .
       .
       .
    };
.
.
.
};

int Graph::Node::maxNumberOfNeighbors = 4;
//also int Graph::Node::maxNumberOfNeighbors(4);


祝你好运!

答案 2 :(得分:-1)

class Node {
public:
    static const int maxNumberOfNeighbors = 4;
};