C++无需cpp文件的静态类变量

5

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

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,这样也可以,尽管依赖于这个值有点过于hackish。更重要的是,如果不在某个地方对其进行初始化,链接器会抱怨找不到引用。

2个回答

6

使用内联函数(自由函数或成员函数):inline function

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++17中,可以使用inline变量:
struct Foo
{
    static inline unsigned sNextID;
};

哦,我喜欢模板选项。虽然我还没有开始使用模板,但我会朝着那个方向前进的。谢谢。 - ryan0270

0
在头文件中(假设它的名称为data.h),在末尾添加以下内容。
class Data
{
    .....
  private:
  static unsigned int sNextID;
};

#ifdef MY_INIT
unsigned int sNextID = 0;
#endif

在你的主文件中

#define MY_INIT
#include "data.h"

在所有其他包含头文件的文件中,只需使用普通的。
#include "data.h"

这将确保行unsigned int sNextID = 0;只会被编译到一个翻译单元中 - 即带有main的那个。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接