【问题标题】:How to declare and initialize a static member in a class? [duplicate]如何在类中声明和初始化静态成员? [复制]
【发布时间】:2019-05-13 08:00:39
【问题描述】:

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

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 */

【问题讨论】:

  • 使用c++17可以在类体中内联定义静态成员:static inline int maxNumberOfNeighbors = 4;否则,必须先在类体中声明,再在外定义。
  • 处理static成员变量的“经典”方式是只在类中声明它们,然后进行定义和(可能)在外部初始化(在单个源文件中)。

标签: c++ initialization static-members


【解决方案1】:

最简单的做法是遵循错误消息的建议。如果它抱怨非常量静态,请将其设为 const。

static int const maxNumberOfNeighbors = 4;

特别是考虑到它应该是一个常数,按照它的名字。你不会改变最大值吧!?

否则,如果您打算对其进行变异,只需在类定义之外进行初始化和定义即可。

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

【讨论】:

  • 我不想成为 const,因为邻居引用指向一个数组,在 .cpp 文件的构造函数中。我不希望它是 const 以防数组被填充,以便我可以将内容移动到更大的数组并分配给数组返回指针邻居
【解决方案2】:

绝对可以拥有非 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);


祝你好运!

【讨论】:

    【解决方案3】:
    class Node {
    public:
        static const int maxNumberOfNeighbors = 4;
    };
    

    【讨论】:

      猜你喜欢
      • 2013-07-12
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 2015-05-18
      相关资源
      最近更新 更多