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

时间:2013-05-20 00:14:30

标签: 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;

}
setPos(mapToParent(smijer,0));
}

我将smijer变量定义为static int。但我不知道如何在程序启动时初始化它一次,以及如何在每次调用函数后保持其新值。

4 个答案:

答案 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)

为什么我被投票?他希望在函数调用后更改变量并保留状态。 (他没有说明变量是否是该类的成员或任何东西,所以我假设它不是。如果他澄清并且不那么含糊地陈述他的问题,我会改变我的答案。)

你错了。要在函数的作用域结束后保留​​变量,必须在堆而不是堆栈上分配它。您可以使用newmalloc执行此操作,但您还必须按此顺序使用deletefree释放此内存。

newdelete

#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;
}

使用mallocfree

#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,并记住值。您不需要初始化它。但是如果你愿意,你可以。