有没有办法初始化函数中的变量并保存其值以便下次调用函数?
我在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。但我不知道如何在程序启动时初始化它一次,以及如何在每次调用函数后保持其新值。
答案 0 :(得分:11)
你的答案基本上都在你的问题中。静态变量(函数的类成员或局部变量)仅在终止时初始化一次。例如;
#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值,就像;
Svar :6
Svar :7
Svar :8
所以当你看到我们调用foo函数三次时,静态变量的初始化只进行一次。
答案 1 :(得分:1)
如果smijer
是班级objekt
的成员,那么就这样做:
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;
虽然在这种情况下我会把它放在命名空间中。在这种情况下,它不会被声明为静态,但它确实具有程序的生命周期。
答案 2 :(得分:1)
为什么我被投票?他希望在函数调用后更改变量并保留状态。 (他没有说明变量是否是该类的成员或任何东西,所以我假设它不是。如果他澄清并且不那么含糊地陈述他的问题,我会改变我的答案。)
你错了。要在函数的作用域结束后保留变量,必须在堆而不是堆栈上分配它。您可以使用new
或malloc
执行此操作,但您还必须按此顺序使用delete
和free
释放此内存。
new
和delete
:
#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;
}
使用malloc
和free
:
#include <iostream>
#include <cstdlib>
void modify(int * p){
(*p)++;
}
int main(void){
int * pointer = (int*)malloc(sizeof(int)); //DO NOT CAST IN C
*pointer = 5;
std::cout << *pointer << std::endl;
modify(pointer);
std::cout << *pointer << std::endl;
free(pointer);
return 0;
}
new
确实提供了快速删除数组的功能,对于正常使用的C ++来说总体上更好。
答案 3 :(得分:0)
在函数内部将变量声明为static,并记住值。您不需要初始化它。但是如果你愿意,你可以。