有人可以帮助我理解,如果创建了一个带有非默认构造函数的新实例,为什么在下面的类中定义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.
我不明白这里发生了什么。
答案 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;