在 DMA 之后反向更改为 int
Reverse changes to int after DMA
假设我在 class 中初始化了以下变量:
class testClass {
public:
int someInt = 5;
};
并且我想像这样添加或修改它:
int main() {
testClass *t = new testClass;
cout << t->someInt << endl;
t->someInt = 1;
cout << t->someInt << endl;
delete t;
cout << t->someInt;
}
如何将 t->someInt
到 someInt
所做的更改恢复到 int i = 5
的初始声明?
另外,当我在cout << t->someInt
之前调用删除时仍然存在。为什么 t->someInt
的输出仍然等于 1
?不应该被删除吗?
我正在开发一个有当前变量的游戏,我想在玩家获得分数时动态更改变量,例如分数,以释放内存并允许玩家在变量之后重玩游戏被退回。
为了让"t"没有值,你必须将它设置为nullptr。 (t = nullptr)
How can I revert the changes done by the t->someInt to someInt back to
the initial declaration, of int i = 5?
您必须存储要还原的值的副本。您可以只存储 int 或整个 class.
的副本
例如,下面的代码将t
的当前值存储在t_backup
中:
int main()
{
testClass *t = new testClass;
cout << t->someInt << endl;
testClass *t_backup = new testClass(*t);
t->someInt = 1;
cout << t->someInt << endl;
*t = *t_backup;
cout << t->someInt << endl;
delete t_backup;
delete t;
}
显然,如果您的 class 更复杂,您将不得不定义自己的复制构造函数和赋值运算符。
Also, when I call delete before cout << t->someInt still exists. Why
does the output of t->someInt still equals 1? Shouldn't it have been
deleted?
调用delete后,变量的任何使用都是"undefined behaviour"。这意味着(几乎)任何事情都可能发生。它可以打印数字,也可以使您的计算机崩溃。
有几种方法。
第一个也是最简单的方法是复制变量(或多个)。根据您所说的,这可能是您真正想要的。
int input1 = 1;
char input2 = 'a';
while (play_game(input1, input2))
;
这会重复调用 play_game
,每次调用时,这两个变量都会以规定的值开始。 play_game
可以根据需要修改它们的本地副本,但一旦退出,这些更改就会消失。
如果您确实遇到需要修改对象的情况,然后 return 该对象恢复到其先前的值,您可能需要考虑 memento pattern.
假设我在 class 中初始化了以下变量:
class testClass {
public:
int someInt = 5;
};
并且我想像这样添加或修改它:
int main() {
testClass *t = new testClass;
cout << t->someInt << endl;
t->someInt = 1;
cout << t->someInt << endl;
delete t;
cout << t->someInt;
}
如何将 t->someInt
到 someInt
所做的更改恢复到 int i = 5
的初始声明?
另外,当我在cout << t->someInt
之前调用删除时仍然存在。为什么 t->someInt
的输出仍然等于 1
?不应该被删除吗?
我正在开发一个有当前变量的游戏,我想在玩家获得分数时动态更改变量,例如分数,以释放内存并允许玩家在变量之后重玩游戏被退回。
为了让"t"没有值,你必须将它设置为nullptr。 (t = nullptr)
How can I revert the changes done by the t->someInt to someInt back to the initial declaration, of int i = 5?
您必须存储要还原的值的副本。您可以只存储 int 或整个 class.
的副本例如,下面的代码将t
的当前值存储在t_backup
中:
int main()
{
testClass *t = new testClass;
cout << t->someInt << endl;
testClass *t_backup = new testClass(*t);
t->someInt = 1;
cout << t->someInt << endl;
*t = *t_backup;
cout << t->someInt << endl;
delete t_backup;
delete t;
}
显然,如果您的 class 更复杂,您将不得不定义自己的复制构造函数和赋值运算符。
Also, when I call delete before cout << t->someInt still exists. Why does the output of t->someInt still equals 1? Shouldn't it have been deleted?
调用delete后,变量的任何使用都是"undefined behaviour"。这意味着(几乎)任何事情都可能发生。它可以打印数字,也可以使您的计算机崩溃。
有几种方法。
第一个也是最简单的方法是复制变量(或多个)。根据您所说的,这可能是您真正想要的。
int input1 = 1;
char input2 = 'a';
while (play_game(input1, input2))
;
这会重复调用 play_game
,每次调用时,这两个变量都会以规定的值开始。 play_game
可以根据需要修改它们的本地副本,但一旦退出,这些更改就会消失。
如果您确实遇到需要修改对象的情况,然后 return 该对象恢复到其先前的值,您可能需要考虑 memento pattern.