2013-05-20 7 views
5

C'è un modo per inizializzare una variabile in una funzione e salvare il suo valore per la prossima chiamata di funzione?C++: salva il valore variabile per il prossimo richiamo della funzione

Sto facendo applicazione in qt e ho una funzione connessa con un segnale. Voglio che una variabile in quella funzione cambi dopo che l'altra raggiunge il suo obiettivo. Ecco il corpo di quella funzione:

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

Ho definito la variabile smijer come statica int. Ma non so come inizializzarlo solo una volta, all'avvio del programma, e come mantenere il suo nuovo valore dopo ogni chiamata della funzione.

+2

Le variabili statiche * sono * inizializzate una sola volta. Qual è il problema? –

+0

Dove inizializzarlo? Nel file di intestazione? Da un'altra classe? Ho provato l'inizializzazione da un'altra classe ma ottengo questo errore: objekt.obj: -1: errore: LNK2001: simbolo esterno non risolto "public: static int objekt :: smijer" (? Smijer @ objekt @@ 2HA) – speedyTeh

+0

probabilmente dovresti inizializzare membro statico della classe all'interno della classe. o spostarlo nell'altra classe e passare il valore a questo. – Sergi0

risposta

0

Se smijer è un membro della classe di objekt, quindi fare in questo modo:

objekt.h:

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

objekt.cpp

int objekt::smijer = YOUR_INITIALIZATION_VALUE; 

D'altra parte, se vuoi/avere bisogno di smijer per essere una variabile globale, quindi farlo in questo modo:

globals.h:

extern int smijer; 

globals.cpp // o un altro file cpp

int smijer = YOUR_INITIALIZATION_VALUE; 

Anche se in questo caso mi piacerebbe restare in uno spazio dei nomi. In questo caso non è dichiarato statico ma ha la durata del tuo programma.

0

Dichiarare la variabile come statica all'interno della funzione e il valore verrà ricordato. Non è necessario inizializzarlo. Ma puoi, se vuoi.

+0

Non vero. http://ideone.com/ZBA1PP –

+0

Scusa se non capisco, perché? Cosa intendi? – Moberg

+0

@MattPhillips Quella non è una variabile 'static' a livello di funzione. Lo hai confuso con una variabile membro 'static', che è completamente diversa. – jamesdlin

0

Perché sono in downvoted? Vuole cambiare una variabile e preservare gli stati dopo le chiamate di funzione. (Non specifica se la variabile è un membro della classe o qualcosa del genere, quindi suppongo che non lo sia. Cambierò la mia risposta se chiarisce e afferma la sua domanda in modo meno ambiguo.)

Sei andando su questo sbagliato. Per mantenere una variabile al termine dell'ambito di una funzione, è necessario allocarlo sull'heap anziché sullo stack. È possibile utilizzare new o malloc per eseguire questa operazione, ma è anche necessario liberare questa memoria con delete e free, in questo ordine.

Con new e delete:

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

E con malloc e free:

#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 FORNISCE strutture per cancellare le matrici in modo rapido ed è complessivamente migliore per l'utilizzo normale C++.

10

La tua risposta è fondamentalmente nella tua domanda. Le variabili statiche (un membro della classe o una variabile locale di una funzione) vengono inizializzate solo una volta dove viene terminata.Per esempio;

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

se si scrive un programma come quello stamperà i valori di Svar proprio come;

Svar :6 
Svar :7 
Svar :8 

Quindi, come si vede, anche se noi chiamiamo funzione foo tre volte l'inizializzazione di un varible statico viene effettuata una sola volta.

Problemi correlati