Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在调用析构函数以重用数据后保留另一个对象指针副本_C++_Constructor_Destructor - Fatal编程技术网

C++ 在调用析构函数以重用数据后保留另一个对象指针副本

C++ 在调用析构函数以重用数据后保留另一个对象指针副本,c++,constructor,destructor,C++,Constructor,Destructor,我正在开发一款棋盘游戏,比如跳棋。板上的每一块瓷砖都有一定的属性。在更改线路板状态之前,我想保存它的状态并使用它撤消最后一次移动。随着状态的更改,所有对象都将被销毁并创建新对象。有没有办法保留这些指针以及调用析构函数?您不想以这种方式保留指针。如果在删除这些指针后试图通过这些指针访问数据,则会出现访问冲突。一旦它们被删除,它们指向的内存就不应该通过这些指针访问 如果您复制这些指针,它们也将具有相同的地址,因此通过所复制的副本访问内存将导致相同的情况发生。你需要考虑一种不同的方法 有两种方法可以用

我正在开发一款棋盘游戏,比如跳棋。板上的每一块瓷砖都有一定的属性。在更改线路板状态之前,我想保存它的状态并使用它撤消最后一次移动。随着状态的更改,所有对象都将被销毁并创建新对象。有没有办法保留这些指针以及调用析构函数?

您不想以这种方式保留指针。如果在删除这些指针后试图通过这些指针访问数据,则会出现访问冲突。一旦它们被删除,它们指向的内存就不应该通过这些指针访问


如果您复制这些指针,它们也将具有相同的地址,因此通过所复制的副本访问内存将导致相同的情况发生。你需要考虑一种不同的方法

有两种方法可以用来保持游戏状态:

将构成游戏状态的每个对象序列化到内存或存储器中,从而有效地保存状态并能够返回。 仅保留从一个游戏状态到另一个游戏状态的更改。
我不认为使用指针是你设计的核心。没有必要保留旧的指针,而且,就我所见,根本不需要指针。可以保存对象本身的旧状态,也可以保存一系列更改。在这种情况下,我会选择后者。

这是一个设计问题,而不是指针/实现问题。 考虑撤消/重做的一种方法是两个堆栈,每个任务一个

无论何时移动,都会推动配置/游戏状态、对象等。。将撤销堆栈作为一个元素向下,当你按下撤销时,弹出该堆栈中的一个元素,将其应用到游戏中,并将该元素推送到重做堆栈中。 重做堆栈在新移动完成时被清除

在调用对象的析构函数、指针或无指针后,不能使用该对象。您可以在将对象下推到堆栈之前将其作为一个整体复制,也可以使用指向该对象的指针,任何适合您的操作都可以

您可能对使用共享指针感兴趣,因为它们为您提供了更多的可能性


如果你想有效地使用内存,除了保存整个游戏状态外,另一种方法是只保存游戏中的更改,而不是整个游戏的快照,但这通常需要更多的工作,尽管这是一种聪明的方法,为什么不使用链接来撤销同一平铺对象中的列表呢。。。作为一个链表,当用户撤消状态时,您操作此列表中的数据和标题中的数据

如果要实现撤消,则需要存储副本或抽象信息以允许撤消。。。。到目前为止,您尝试了什么?@Caribou我正在创建另一个具有此类对象属性的类对象,并使用该类对象重新创建properties@dkumar理论上是的,如果你深度复制了对象,那么你可以在删除原件后安全地访问这些副本,但是问问自己为什么要这样做??你的问题在于设计。阅读其他一些答案/评论以获得指导。@dkumar——理论上是一种修辞——在这种情况下,它实际上意味着你可以这样做。有一次,一位德国朋友告诉我,他几乎不理会一个英国人说的任何话,但。。因为在这之后是最重要的部分,如果我想将所有步骤存储在一个数组中,一次单击就可以提供许多撤消或重做,那么可以做什么呢?这是相同的想法。您的撤消堆栈中有20个元素,并且希望返回10个步骤,因此您从撤消堆栈中弹出10个元素,将它们应用到游戏中,并将它们推入重做stack@dkumar我不是说把删除的指针放在列表中。。放置一些数据,从中可以返回到以前的状态,即“撤消”。。