【发布时间】:2017-03-09 22:20:33
【问题描述】:
我正在尝试对一些使用的对象进行定期快照。为此,我使用 TakeSnapshot() 方法,其工作原理如下:
调用 TakeSnapshot() 的游戏管理器有一个指向我要保存的对象的指针列表 (std::list objects;) 它遍历指针,取消引用它们并创建一个新的 Object复制我感兴趣的值的相同类型。
复制后,将新对象推送到向量上并创建新的 GameState 对象(游戏状态是“快照”)。
然后它将向量存储在新的 GameState 对象中,并将 GameState 对象推送到游戏状态队列中,如果队列的大小超过某个预定数量,它将以 FIFO 方式丢弃。
我遇到的问题是,为了以后的游戏计算,我需要一个指向游戏最新快照的工作指针。我试图将它存储在公共 GameState* 中,但是当我从 Main 函数中取消引用它时,它不会返回正确的值(?)。但是如果我尝试在 TakeSnapshot() 中取消引用它,它会返回正确的值
FPS.cpp
// FPS.cpp : Defines the entry point for the console application.
class GameState {
public:
std::vector<Object> objects;
};
class GameManager {
public:
int tick = 0;
int tickrate = 150;
int memorySize = tickrate;
std::list<Object*> objects;
std::queue<GameState> snapshots;
GameState * latestSnapshot;
void AddObject(Object* object) {
objects.push_back(object);
}
void TakeSnapshot() {
GameState snapshot;
std::vector<Object> objectsCopy;
std::list<Object*>::const_iterator it;
for (it = objects.begin(); it != objects.end(); ++it) {
Object copyObject;
copyObject.position = (*it)->position;
objectsCopy.push_back(copyObject);
}
snapshot.objects = objectsCopy;
latestSnapshot = &snapshot;
snapshots.push(snapshot);
if (snapshots.size() > memorySize) {
snapshots.pop();
}
cout << (*latestSnapshot).objects.size() << endl; // <--- RETURNS 2
}
};
int main(){
GameManager gameManager;
Object player;
Object player2;
player.position = Vector(154, 0, 0);
gameManager.AddObject(&player);
gameManager.AddObject(&player2);
GameState latestSnapshot = *gameManager.latestSnapshot;
cout << latestSnapshot.objects.size() << endl;// <--- RETURNS 0
}
编辑只留下代码的相关部分。
【问题讨论】:
-
欢迎来到 Stack Overflow。请花时间阅读The Tour 并参考Help Center 中的材料,您可以在这里问什么以及如何问。
-
能否请您删除所有不相关的代码并将其缩小到重现问题的minimal reproducible example?
-
在您的函数
TakeSnapshot()上,变量GameState snapshot在函数结束时被销毁。然后指针latestSnapshot不再指向有效对象。当您通过GameState latestSnapshot = *gameManager.latestSnapshot在主函数上调用它时,latestSnapshot指向的对象不再存在(位于堆栈上)。 -
哦,我明白了,所以我必须让指针指向队列中的最后一个值?