不带CPP文件的c++静态类变量

c++ static class variable without cpp file

本文关键字:静态 静态类 类变量 c++ CPP 文件 不带      更新时间:2023-10-16

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

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,这很好,尽管依赖于它似乎有点粗俗。更重要的是,如果不初始化它,链接器就会抱怨引用未定义。

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

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;
};

在头文件中(假设它的名称是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的翻译单元。