【问题标题】:C++: save variable value for next call of the functionC++:为下次调用函数保存变量值
【发布时间】:2013-05-20 00:14:29
【问题描述】:

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

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

【问题讨论】:

  • 静态变量初始化一次。有什么问题?
  • 在哪里初始化呢?在头文件中?来自另一个班级?我尝试从另一个类进行初始化,但出现此错误:objekt.obj:-1: error: LNK2001: unresolved external symbol "public: static int objekt::smijer" (?smijer@objekt@@2HA)
  • 你可能应该在类中初始化类的静态成员。或将其移至另一个类并将值传递给该类。
  • smijerobjekt 类的成员吗?
  • smijer是否需要被其他函数使用?您真的希望它具有全局生命周期,而不是与 objekt 的生命周期绑定吗?

标签: c++ static initialization


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    你做错了。要在函数作用域结束后保留​​变量,您必须将其分配在堆上而不是堆栈上。您可以使用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】:

      如果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;
      

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 对不起,我不明白,为什么?什么意思?
        • @MattPhillips 这不是函数级别的 static 变量。您将它与 static 成员变量混淆了,这是完全不同的。
        • @jamesdlin 是的,我意识到我误解了答案,但不知何故,我对此的评论被删除了。但是我认为 OP 想要的不仅仅是功能级别的范围。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多