7

有没有办法在函数中初始化一个变量并保存它的值以便下次调用函数?

我正在 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 变量定义为静态 int。但我不知道如何只初始化一次,程序启动时,以及如何在每次调用函数后保持其新值。

4

4 回答 4

13

你的答案基本上在你的问题中。静态变量(函数的类成员或局部变量)仅在终止时初始化一次。例如;

#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 函数三次,但静态变量的初始化只进行了一次。

于 2013-05-20T00:38:08.813 回答
1

如果smijer是 class 的成员objekt,那么这样做:

对象.h:

class objekt
{
   ...
   static int smijer;
   ...
};

对象.cpp

int objekt::smijer = YOUR_INITIALIZATION_VALUE;

另一方面,如果您想/需要smijer成为全局变量,请这样做:

全局变量.h:

extern int smijer;

globals.cpp //或者另一个.cpp文件

int smijer = YOUR_INITIALIZATION_VALUE;

尽管在这种情况下,我会将其粘贴在名称空间中。在这种情况下,它没有被声明为静态的,但它确实具有程序的生命周期。

于 2013-05-20T00:25:41.940 回答
1

为什么我被否决了?他想更改一个变量并在函数调用后保留状态。(他没有指定变量是类的成员还是其他任何东西,所以我假设它不是。如果他澄清并不太含糊地陈述他的问题,我会改变我的答案。)

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

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++。

于 2013-05-20T00:29:06.543 回答
0

在函数内部将变量声明为静态变量,并且值将被记住。你不需要初始化它。但如果你愿意,你可以。

于 2013-05-20T00:26:43.313 回答