2013-05-20 45 views
5

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

我在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。但是我不知道如何在程序启动时只初始化一次,以及在每次调用函数后如何保持它的新值。

+2

静态变量*只被初始化一次。有什么问题? –

+0

在哪里初始化它?在头文件中?从另一个班级?我尝试从另一个类初始化,但我得到这个错误:objekt.obj:-1:错误:LNK2001:无法解析的外部符号“public:static int objekt :: smijer”(?smijer @ objekt @@ 2HA) – speedyTeh

+0

您可能应该初始化类中的类的静态成员。或者将它移动到另一个类并将值传递给这个类。 – Sergi0

回答

0

如果smijerobjekt类的成员,那么像这样做:

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; 

虽然在这种情况下我会坚持在一个命名空间。在这种情况下,它没有被声明为静态的,但它确实具有程序的生命周期。

0

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

+0

不正确。 http://ideone.com/ZBA1PP –

+0

对不起,我不明白,为什么?你什么意思? – Moberg

+0

@MattPhillips这不是一个函数级别的'static'变量。你已经将它与'static'成员变量混淆了,这是完全不同的。 – jamesdlin

0

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

你是去做这个错误。为了在一个函数的作用域结束后保留​​一个变量,你必须在堆上而不是堆栈上分配它。您可以使用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++更好的整体。

10

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

#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函数三次静态varible的初始化只需进行一次。

相关问题