C++ C++;:为下一次调用函数保存变量值
是否有方法初始化函数中的变量并保存其值以供下次调用函数 我正在qt中应用,我有一个与信号相连的函数。我希望该函数中的一个变量在另一个达到其目标后改变。以下是该函数的主体:C++ C++;:为下一次调用函数保存变量值,c++,static,initialization,C++,Static,Initialization,是否有方法初始化函数中的变量并保存其值以供下次调用函数 我正在qt中应用,我有一个与信号相连的函数。我希望该函数中的一个变量在另一个达到其目标后改变。以下是该函数的主体: void objekt::advance(int phase) { if(!phase) return; QPointF location = this->pos(); if (int(location.x())==200 || int(location.x())==-200) { smijer=-smijer
void objekt::advance(int phase)
{
if(!phase) return;
QPointF location = this->pos();
if (int(location.x())==200 || int(location.x())==-200)
{
smijer=-smijer;
}
setPos(mapToParent(smijer,0));
}
我将smijer变量定义为static int。但我不知道如何在程序启动时只初始化它一次,以及如何在每次调用函数后保持它的新值。如果
smijer
是类objekt
的成员,则按如下操作:
目标h:
class objekt
{
...
static int smijer;
...
};
objekt.cpp
int objekt::smijer = YOUR_INITIALIZATION_VALUE;
另一方面,如果您希望/需要smijer
成为全局变量,请执行以下操作:
globals.h:
extern int smijer;
globals.cpp//或其他.cpp文件
int smijer = YOUR_INITIALIZATION_VALUE;
虽然在这种情况下,我会把它放在一个名称空间中。在这种情况下,它不是声明为静态的,但它具有程序的生存期。在函数中将变量声明为静态的,值将被记住。您不需要初始化它。但是如果你愿意,你可以。为什么我被否决了?他希望在函数调用后更改变量并保留状态。(他没有指定变量是否是类的成员或任何东西,所以我假设不是。如果他澄清并不那么含糊地陈述他的问题,我会更改我的答案。) 你做得不对。要在函数的作用域结束后保留变量,必须在堆上而不是堆栈上分配它。您可以使用
new
或malloc
来执行此操作,但您还必须按照delete
和free
的顺序释放此内存
使用新建
和删除
:
#include <iostream>
void modify(int * p){
(*p)++;
}
int main(void){
int * pointer = new int;
*pointer = 5;
std::cout << *pointer << std::endl;
modify(pointer);
std::cout << *pointer << std::endl;
delete pointer;
return 0;
}
<>代码>新< /COD>确实提供了快速删除数组的工具,对于正常使用C++来说更好。 < p>基本上是你的答案。静态变量(类成员或函数的局部变量)仅在终止时初始化一次。比如,
#include <iostream>
int foo () {
static int sVar = 5;
sVar++;
return sVar;
}
using namespace std;
int main () {
int iter = 0;
do {
cout << "Svar :" foo() << endl;
iter++;
}while (iter < 3);
}
因此,正如您所看到的,虽然我们调用foo函数三次,但是静态变量的初始化只完成一次。静态变量只初始化一次。有什么问题?在哪里初始化?在头文件中?来自另一个班级?我尝试从另一个类初始化,但得到以下错误:objekt.obj:-1:错误:LNK2001:未解析的外部符号“public:static int-objekt::smijer”(?smijer@objekt@@2HA)您可能应该初始化类内部的类的静态成员。或者将其移动到另一个类并将值传递到此类。
smijer
是否为类objekt
的成员?是否需要其他函数使用smijer
?你真的希望它有全局生存期,而不是绑定到objekt
的生存期吗?对不起,我不明白,为什么?你是什么意思?@mattfillips这不是一个函数级静态变量。你把它和一个完全不同的静态成员变量混淆了。@jamesdlin是的,我意识到我误解了答案,但不知何故,我的注释被删除了。然而,我认为OP需要的不仅仅是功能级别的范围。
#include <iostream>
int foo () {
static int sVar = 5;
sVar++;
return sVar;
}
using namespace std;
int main () {
int iter = 0;
do {
cout << "Svar :" foo() << endl;
iter++;
}while (iter < 3);
}
Svar :6
Svar :7
Svar :8