7

関数内の変数を初期化し、関数の次の呼び出しのためにその値を保存する方法はありますか?

私はqtでアプリケーションを作成しています.1つの関数が信号に接続されています。その関数の変数が、他の変数が目標に達した後に変更されるようにします。その関数の本体は次のとおりです。

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

4 に答える 4

13

あなたの答えは基本的にあなたの質問にあります。静的変数 (関数のクラス メンバーまたはローカル変数のいずれか) は、終了する場所で 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 関数を 3 回呼び出しますが、静的変数の初期化は 1 回だけ行われます。

于 2013-05-20T00:38:08.813 に答える
1

smijerが class のメンバーである場合、次のobjektようにします。

オブジェクト.h:

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

オブジェクト.cpp

int objekt::smijer = YOUR_INITIALIZATION_VALUE;

一方、smijerグローバル変数にしたい/する必要がある場合は、次のようにします。

globals.h:

extern int smijer;

globals.cpp //または別の .cpp ファイル

int smijer = YOUR_INITIALIZATION_VALUE;

この場合、私はそれを名前空間に貼り付けます。この場合、静的と宣言されていませんが、プログラムの有効期間があります。

于 2013-05-20T00:25:41.940 に答える
1

なぜ私は反対票を投じられているのですか? 彼は変数を変更し、関数呼び出し後に状態を保持したいと考えています。(彼は変数がクラスのメンバーであるかどうかを指定していないので、そうではないと想定しています。彼が質問を明確にし、曖昧さを減らして述べている場合は、答えを変更します。)

あなたはこれについて間違っています。関数のスコープが終了した後も変数を保持するには、スタックではなくヒープに変数を割り当てる必要があります。newまたはを使用mallocしてこれを行うことができますが、このメモリを解放するには、deleteおよび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 に答える