不带CPP文件的c++静态类变量
c++ static class variable without cpp file
我有一个简单的类用于存储传感器数据,可以总结为
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
的翻译单元。
相关文章:
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 我的编译器是否忽略了我未使用的静态thread_local类成员
- 静态存储类C++计数
- 内联初始化的静态 const 类成员的初始化顺序保证
- 继承:动态派生类成员与静态派生类成员
- 避免在静态常量类上定义但不使用
- 根据模板参数可以选择静态的类成员
- 为什么不允许静态成员变量的初始化在类中,而允许静态静态成员的初始化
- 子类中具有不同值的静态基类属性
- 等效于 Java 静态对象类C++
- 是否可以按模板类型更改静态 const 类成员的值
- 如何在标题和CPP之间拆分静态/模板类
- 静态模板类成员函数的这两个调用之间有什么区别?
- 对静态重载(类)函数/方法的调用是不明确的
- 具有静态模板类成员的模板类:如何定义静态成员
- pthread没有静态的类
- 单例文件静态与类私有静态
- 使用折叠表达式初始化静态 constexpr 类数据成员不编译
- constexpr静态结构类成员的声明冲突
- 初始化在 C++ 中自定义类的构造函数中没有参数的静态 const 类成员