当我编译包含以下头文件的代码时,我收到一条错误消息:
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 */
答案 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;
};