【问题标题】:c++ static class variable without cpp file没有cpp文件的c ++静态类变量
【发布时间】:2013-04-07 02:56:33
【问题描述】:

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

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,这很好,尽管依赖它似乎有点骇人听闻。更重要的是,如果没有在某个地方初始化它,链接器会抱怨未定义的引用。

【问题讨论】:

    标签: c++ static-members


    【解决方案1】:

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

    【讨论】:

    • 哦,我喜欢模板选项。我还没有开始使用模板,但无论如何我都会朝着这个方向前进。谢谢
    【解决方案2】:

    在头文件中(假设它的名称是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 的那个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 2016-06-08
      • 1970-01-01
      • 2016-08-30
      • 2020-11-01
      相关资源
      最近更新 更多