静态变量重新初始化

时间:2012-02-15 19:55:57

标签: c++ static-members

有人可以帮助我理解,如果创建了一个带有非默认构造函数的新实例,为什么在下面的类中定义static的变量masterID会重新初始化?

static unsigned int masterID=0;

class game{
public:
   unsigned int m_id;
   unsigned int m_players;

   // default constructor
   game():m_id(masterID++){

   }

   // another constructor using a game instance
   game(game g): m_id(masterID++){
   ...
   }

   // copy constructor
   // copy constructor
   game(const game &o)
   : m_id(o.m_id), m_players(o.m_players)
   {    }

   // assignment operator
   game& operator =(const game o){
    m_id = o.m_id;
    m_players = o.m_players;
    return *this;
};

使用此代码,只要我使用默认构造函数创建实例,例如

game g1, g2;

m_id取值为0,1,2 ......等。

但是,如果现在我创建了第三个实例

game g3(g2);

g3的m_id再次为0.

我不明白这里发生了什么。

1 个答案:

答案 0 :(得分:2)

这是因为static unsigned int masterID=0;位于您的.h文件中。它不应该存在:你现在的方式,你在每个编译单元中得到一个单独的静态变量,其中包含你的.h文件。

正确的方法是在您的班级中声明masterID静态,并在单个.cpp文件中初始化它。

在你的.h文件中:

class game{
public:
    unsigned int m_id;
    unsigned int m_players;
    static unsigned int masterID; // no initialization!

   // default constructor
   game():m_id(masterID++){

   }

   // another constructor
   game(unsigned int players): m_id(masterID++), m_players(players){

   }
};

在你的cpp文件中:

game::masterID = 0;