我有以下代码:
namespace GameStatus{
static std::vector<SavePoint>savePoints;
}SavePoint是:
class SavePoint{
public:
int distance;
int score;
SavePoint(int d,int s){
distance = d;
score = s;
};
};问题是,即使GameStatus::savePoints是static,该向量似乎包含或不包含元素,这取决于调用类的类型。
例如,如果我有一个类添加了一个保存点:
class Game{
void addSavePoint(){
SavePoint savepoint(12,10);
GameStatus::savePoints.push_back(savepoint);
}
void testView(){
if(!GameStatus::savePoints.empty()){
Log("There is a save point"); // Can see that savePoints is not empty in the debugger. Everything looks ok here.
}
}
}但如果我还有别的课:
class Foo{
void something(){
if(GameStatus::savePoints.empty()){ // In this class it appears that the vector is empty.
//..do something.
}
}
}我有一个游戏循环,它交替执行游戏和Foo中的代码,在Game中,GameStatus::savePoints有一个savePoint(不是空的),而在Foo中,它没有(看起来是空的)。这对我来说毫无意义,因为savePoints是静态的。因此,两个类都应该访问同一个对象。
如果不同的类,为什么GameStatus::savePoints具有不同的值?
发布于 2015-06-11 08:38:25
static关键字在C++中有两个含义。
解决方案:您应该使用extern存储说明符而不是static将声明放到标头上,因为您希望它是全局的。之后,您应该将定义放到一个.cpp文件中,该文件是一个编译单元/对象。这样,您将有一个向量的实例,它可以从包含标头的所有其他编译单元中访问。
头文件:
namespace GameStatus{
extern std::vector<SavePoint> savePoints;
}cpp文件:
std::vector<SavePoint> GameStatus::savePoints;发布于 2015-06-11 08:26:47
类之外的static变量仅在当前编译单元中定义(编译单元是正在编译的当前源,即当前源文件及其所有包含的文件)。当您在标头中放置静态变量时,包含该头的每个源文件都会得到自己的副本。
有两种方法可以解决这个问题:
不要使它是静态的-将static关键字更改为“extern”,您将引用一个全局变量。然后,您需要在一个源文件中定义全局变量。例如:
标题:
extern std::vector<SavePoint>savePoints;Game.cpp:
std::vector<SavePoint> GameStatus::savePoints;2-把它放在类中--类内的静态变量只创建一次。请注意,如果将其放入类中,则需要在标头中声明它,并在单个编译单元中进行定义,否则将得到链接器错误。例如:
标题:
class Game {
public:
std::vector<SavePoint>savePoints;
}Game.cpp:
std::vector<SavePoint> Game::savePoints;https://stackoverflow.com/questions/30775233
复制相似问题