C++ C++;:为下一次调用函数保存变量值

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

是否有方法初始化函数中的变量并保存其值以供下次调用函数

我正在qt中应用,我有一个与信号相连的函数。我希望该函数中的一个变量在另一个达到其目标后改变。以下是该函数的主体:

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