c ++没有cpp文件的静态类变量

时间:2013-04-07 02:56:33

标签: c++ static-members

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

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 个答案:

答案 0 :(得分:6)

使用inline function(独立或会员):

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

课程模板(对其静态can be in header file的定义):

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

答案 1 :(得分:1)

头文件中的

(假设它的名字是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