Newsgroup: it.comp.lang.c++
Titolo: Ha senso definire un membro statico privato?

Ho un piccolo dubbio: se voglio definire un oggetto statico di una
classe, usato solo da quella classe, potrei fare:
file h:
class A{
public:
 .....
private:
static Oggetto O;}
file cc:
Oggetto A::O(inizializzazione);
Oppure, potrei proprio evitare di dichiararlo come membro della classe
e fare:
***************
file h:
class A{
public:
 .....}
file cc:
Oggetto O(inizializzazione);
....
Visto che l'oggetto è statico e non accessibile dall'esterno della
classe, sembrerebbe che l'effetto sia esattamente lo stesso. Le
funzioni di A potranno usare O esattamente allo stesso modo.
Mi chiedevo se le due alternative sono effettivamente equivalenti...
Una differenza forse è che col secondo metodo neanche le classi friend
poi vedono l'oggetto... Diventa ultraprivato :-)

 poi vedono l'oggetto... Diventa ultraprivato :-)
Si ma è visibile a livello di modulo, cioè a livello di file.
Il che può essere equivalente se non ci sono classi friend e se il 
modulo/file contiene solo la classe in oggetto.
Io comunque a livello di ordine, preferisco definirlo privato.
...
In realtà, ripensandoci, l'oggetto dichiarato nel file e non nella 
classe diventa accessibile se non è comunque static, basta che su un 
altro file venga dichiarato extern.

Stefano Zanobi ha scritto:

Secondo me l'aspetto più importante della differenza che citi (e che 
spesso mi fa propendere per la seconda ipotesi, a patto di dichiarare O 
come static, altrimenti ha linkaggio esterno) è che con la seconda non 
obblighi chi usa la classe A ad avere la dichiaraziobne della classe 
Oggetto. Viceversa nella prima soluzione nel file A.h dovrai avere un 
#include "Oggetto.h" o qualcosa di analogo.
In pratica la seconda soluzione è una cosiddetta "compiler include 
firewall" (e questa è quasi sempre una buona cosa).
A patto naturalmente che il "file scope" sia "ragionevole" (direi <= del 
"class scope") (cioè in pratica che tu non implementi decine di classi o 
un'intero programma in un solo file cpp: seguendo la regola un file una 
classe (o poco più) non sbagli)
GM

 Oggetto.
Ah, ecco... infatti l'oggetto è ancora accessibile tramite un "extern"
da qualche altra parte.
E se ci sono più classi nello stesso file, l'oggetto O diventa in
comune fra tutte.
Si, insomma c'è una bella differenza...
Sullo Stroustrup se ricordo bene lo static per dichiarare una
variabile locale all'unità di compilazione era deprecato (non so xk).
Suggeriva di usare namespace anonimi invece.

 Suggeriva di usare namespace anonimi invece.
Se ricordo bene con un namespace anonimo il compilatore genera un nome 
unico, cioe'
   namespace
   {
     class pippo
     {
       ....
     }
   }
e' come se fosse
   namespace  UnicoNome
   {
     class pippo
     {
       ....
     }
   }
   using namespace UnicoNome;
rendendo pippo accessibile nella sola unita' in cui e' definito ma 
permettendo comunque il linking esterno (per i template)
Ciao

  ....
Sono due cose diverse.
Il primo e' visibile da friend ma non necessariamente dall'unita' di
compilazione, il secondo e' visibile al mondo per come l'hai scritto,
ma suppongo tu ti riferissi a:
static Oggetto O(inizializzazione);
Che e' visibile all'intera unita' di compilazione (file cc) ma non ai
friend esterni. Le tue considerazioni valgono, con la dovuta
correzione, solo sotto ulteriori ipotesi (una classe per unita' di
compilazione).
--*PaN!*
 
-- 
I'm using an evaluation license of nemo since 233 days.
You should really try it!
http://www.malcom-mac.com/nemo

Per quello che mi riguarda preferisco la soluzione numero 1
quella di metterlo come membro protected (e non privato)
della classe.
bye.
