(C ++)取消引用指针在同一个类中调用时返回正确的值,从main调用时返回0

时间:2017-03-09 22:20:33

标签: c++ pointers

我正在尝试使用某些对象的定期快照。为此,我使用TakeSnapshot()方法,其工作方式如下:

  1. 调用TakeSnapshot()的游戏管理器有一个指向我想保存的对象的指针列表(std :: list objects;)它通过指针迭代,取消引用它们并创建一个新的复制我感兴趣的值的相同类型的对象。

  2. 复制后,新对象被推送到矢量上,并创建一个新的GameState对象(游戏状态是'快照')。

  3. 然后它将向量存储在新的GameState对象中,并将GameState对象推送到游戏状态队列中,如果队列大小超过某个预定量,则以FIFO方式丢弃。

  4. 我遇到的问题是,为了以后的游戏计算,我需要有一个指向游戏最新快照的工作指针。我试图将它存储在公共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 
    }
    

    编辑只留下代码的相关部分。

1 个答案:

答案 0 :(得分:0)

正如@tesseractBird所说,错误是由于指针指向一个被破坏的对象引起的,使得它指向我添加到队列中的最后一个值解决了问题。