Newsgroup: it.comp.lang.c++
Titolo: Variabili static in funzioni membro

Ho un dubbio: se io dichiaro una variabile static all'interno di
una funzione membro di una classe, essa e' condivisa
tra i vari oggetti creati ? Esempio:
class A {
   void f(void)
   {
       static int var = 0;
       var++;
   }
}
int main( )
{
    A* p1 = new A;
    A* p2 = new A;
   p1->f();     // mi aspetterei che var valga 1
   p2->f();    //  mi aspetterei che var dell'altro oggetto sia 1
   // delete p1 e p2
}
oppure alla fine la mia "unica" var vale 2 come se avessi :
class A {
   static int var;
   void f(void)
   {
       var++;
   }
}
static int A::var = 0;
Grazie per ogni chiarimento in merito!
:-)
--
Ciao!
Skunkguru

 tra i vari oggetti creati ?
Penso proprio di si.
Se io dichiaro una variabile static dentro una funzione membro, e ad
esempio, la incremento, essa verrà incrementata da ogni differente istanza
della stessa classe.
Ho fatto una prova.
#include <iostream>
using namespace std;
class sCounter
{
        unsigned int c,pk,k;
        public:
        sCounter(unsigned int start) : c(start)
        {
                pk=0;
                k=0;
        }
        void inc()
        {
                static unsigned int k=0;
                ++c;
                pk=++k;
        }
        friend ostream& operator << (ostream& out, const sCounter& C)
        {
                return out << C.c << "(" << C.pk << ")";
        }
};
int main(int argc, char* argv[])
{
        sCounter a(0),b(10);
        a.inc();
        b.inc();
        cout << a << " " << b << endl;
        return 0;
}
La classe contatore sCounter incremente il proprio valore, ma tra parentesi
conta anche il numero di volte che la funzione membro inc è invocata* (da
qualunque istanza).
A dire il vero questo valore viene poi salvato in pk, quindi il conteggio
non si aggiorna... però sono stanco e non mi vengono adesso esempi migliori.
Se commento elimino o commento la linea che dichiara k come variabile
statica, allora le cose cambiano: il conteggio di chiamate alla funzione
membro inc è riferita all'istanza.
A parte il fatto che esistoni esempi migliori, si vede bene la differenza di
comportamento del programma nei due casi, soprattutto provando ad
incrementare più volte a e b.
ciao.

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
SkunkGuru wrote:
| Ho un dubbio: se io dichiaro una variabile static all'interno di
| una funzione membro di una classe, essa e' condivisa
| tra i vari oggetti creati ?
Ovviamente si.
Usare un membro statico dentro una funzione membro e' ad esempio
uno dei tanti modi per implementare un singleton:
//a.h
class A
{
public:
	static A& instance();
	...
private:
	A() {...};	
	~A() {...};
};
//a.cpp
A& A::instance() {
~   static A a;
~   return a;
};
in questo modo puoi usare questa classe in qualsiasi parte
del tuo programma in questo modo:
myA = A::instance();
...
myAA = A::instance();
e sei sicuro che entrambe myA e myAA sono la stessa
istanza di oggetto A, grazie al fatto che la variabile
statica dentro il metodo instance e' condivisa.
Ciao
Gaetano
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.3 (MingW32)
Comment: Using GnuPG with Thunderbird - 
http://enigmail.mozdev.org
iD8DBQFAEd6X7UpzwH2SGd4RAghLAKDn1sqHqAFeDv0x2n8U70CVklEhCACgisIw
63R9gBcQK3B9Ae3/p5imzgU=
=jWXr
-----END PGP SIGNATURE-----