Newsgroup: it.comp.lang.c++
Titolo: funzioni static

Sul libro che sto studiando c'e' scritto che le funzioni membro static 
servono ad accedere alle variabili static, cioe' quelle che non 
appartengono a un oggetto in particolare ma alla rappresentazione della 
classe. Pero' ho visto che a quelle variabili si puo' accedere anche con 
NomeClasse::NomeVariabile da qualunque punto del programma. Quindi a 
cosa servono le funzioni membro static?
-- 
Devaraja (Xdevaraja87^gmail^c0mX)
Linux Registerd User #338167
http://counter.li.org

 
Se sono private non puoi accedervi, ed allora utilizzi le funzioni
membro static ( pubbliche ) che te lo permettono.

Bruno Ripa ha scritto:

Invece una funzione membro pubblica non static non lo permetterebbe?


 cosa servono le funzioni membro static?
Sono come le funzioni non membro, ma sono soggette ai vincoli di
accessibilita'. Possono servire a migliorare la separazione degli
ambiti rispetto all'uso di funzioni libere, dal momento che non rendono
necessario aprire l'accesso ai membri dato della classe di
appartenenza.
Ciao,
Nicola

 
Dunque bisogna un attimo definire il contesto.
Se stai utilizzando una classe ( chiamiamola X ) 'convenzionale', nel
senso che ne istanzi un oggetto e che contiene qualche varibile membro
static, il fatto che tu ne possa istanziare gli oggetti ti garantisce di
poter utilizzare anche metodi non static per accedere a membri privati
static.
Esempio:
class Test
{
public:
	Test()
	{
	}
	static int GetStatic()
	{
		return _value;
	};
	int GetNonStatic() const
	{
		return _value;
	}
private:
	static int _value;
};
[ Ho messo 2 metodi per essere piu' esplicativo ].
Se nel tuo bel main fai:
Test x;
X.GetNonStatic();
X.GetStatic();
Non avrai alcun problema.
Se invece la tua classe e' particolare, ovvero e' un contenitore di
metodi ma non ne puoi istanziare gli oggetti ( almeno non direttamente
come il caso del Singleton ), e cioe' se il sorgente e' praticamente
uguale ma con costruttore privato/protetto, cioe:
class Test
{
public:
 
	static int GetStatic()
	{
		return _value;
	};
	int & GetNonStatic() const
	{
		return _value;
	}
private:
	static int _value;
	Test()
	{
	}
};
innanzitutto di classi cosi' non potrai istanziare oggetti, ma potrai
accedere alla parte 'pubblica' solo utilizzando l'operatore di
visibilita' '::', e cioe'
X::<nome_metodo|nome_variabile>
A questo punto utilizza l'esempio di sopra e prova a fare:
Test::GetStatic(); 	// Ok
Test::GetNonStatic();	// ERRORE - 'Test::GetNonStatic' : illegal call of
non-static member function
oltre a non poter fare:
Test t;
Aggiungo una cosa e chiudo. Probabilmente ti stai chiedendo a cosa puo'
essere utile una classe del genere.
Esempio fresco fresco ( a cui ho tolto tempo per risponderti - mi
serviva una scusa, sto esplodendo ): una classe Math che non vuoi
istanziare ma che scrivi per raggruppare una serie di operazioni che
vuoi fare su Vettori/Matrici/Quaternioni e che non vuoi che siano
operatori membro delle suddette classi; crei la classe Math e la usi cosi':
Math::Inverse( const UMatrix< float, 3, 3 > & ToInvert );
tale funzione e' static e quindi puo' funzionare. Tieni presente che
quando utilizzi variabili membro ( oppure metodi ) static questi
esistono indipendentemente dall'istanziazione della classe; e' per
quello che devi inizializzare le variabili statiche in un'unita' di
compilazione a parte ( generalmente il .cpp della classe ).
E adesso ritorno alle matrici :|
Ciao!

 
si, ma con la funzione membro puoi accedere ai soli dati statici 
anche a prescindere da istanze, mente con membri non statici 
devi quantomeno istanziare un oggetto (e quindi anche i dati non 
statici) al fine di magari accedere ai soli dati statici, e 
questo non è sempre accettabile.
Le funzioni membro non static possono accedere quindi a tutti i 
dati (statici e non) ma solo a partire da un istanza (this)
le funzioni statiche possono accedere ai soli dati statici, ma 
non necessitano istantiazione di oggetti particolari, esistendo 
a prescindere (seppure in copia unica)
ciao
Soviet_Mario