我有一个用于存储传感器数据的简单类,可以概括为
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。但更重要的是,如果没有在某个地方初始化它,链接器会抱怨未定义的引用。
答案 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
。