4

我有一个用于存储传感器数据的简单类,可以概括为

class Data
{
  public:
  Data(){timestamp = Time::now(); id = sNextID++; data = 0; type = DATA_TYPE_UNKNOWN;}

  double data;
  Time timestamp;
  DataType type;

  private:
  static unsigned int sNextID;
};

我有一个头文件,声明了一堆类似的数据类。鉴于类的简单性,不需要实现 cpp 文件。

问题是,没有实现文件如何初始化 sNextID?我在某处读到它默认为 0,这很好,尽管依赖它似乎有点骇人听闻。然而,更重要的是,如果没有在某个地方初始化它,链接器就会抱怨未定义的引用。

4

2 回答 2

6

使用内联函数(独立或成员):

inline unsigned &sNextID()
{
    static unsigned data = 0;
    return data;
}

类模板(它的静态定义可以在头文件中):

template<typename tag>
struct Foo
{
    static unsigned sNextID;
};

template<typename tag>
unsigned Foo<tag>::sNextID=0;

更新:在 C++17inline变量可用:

struct Foo
{
    static inline unsigned sNextID;
};
于 2013-04-07T02:58:02.707 回答
0

在头文件中(假设它的名称是data.h),在最后添加

class Data
{
    .....
  private:
  static unsigned int sNextID;
};

#ifdef MY_INIT
unsigned int sNextID = 0;
#endif

在你有 main 的文件中

#define MY_INIT
#include "data.h"

在您包含标题的所有其他文件中,只是一个普通的

#include "data.h"

这将确保该行将unsigned int sNextID = 0;被编译为仅一个翻译单元 - 带有main.

于 2013-04-07T03:01:51.490 回答