Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 18 su 18
  1. #11
    Originariamente inviato da TheGreatWorld
    Uhm, perdonami, ma credo tu abbia usato il termina istanza un po impropriamente. Non ho capito una cosa: per unica istanza vuoi intendere che ogni oggetto istanziato di quella determinata classe si riferirà sempre ad uno stesso oggetto o vuoi dire che con questo metodo è possibile instanziare una sola volta la classe, dopo di che si riceve un errore di compilazione o affini? Te lo chiedo perche' il discorso è un attimino diverso... molto interessante invece la tecnica del lanciare una eccezione in caso di eccedenza di instanziamenti.

    bye
    la 2°:adhone:








    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

  2. #12
    Ecco, allora sinceramente sei in errore. Guarda questo codice:

    codice:
    
    class Singleton { 
      Singleton() { }
    public: 
      static Singleton& Get() { 
        static Singleton s; 
        return s; 
      } 
    };
    
    
    int main()
    {
       Singleton a = Singleton::Get();
       Singleton b = Singleton::Get();
       return 0;
    }
    Questo codice compila perfettamente (come è giusto che sia) e come ben puoi vedere la classe è stata instanziata per ben due volte (anche se entrambi gli instanziamenti hanno lo stesso valore di Singleton::Get()). Questo perche'? sei stato tratto in errore dal fatto che secondo te una funzione che contiene una var static non può essere lanciata due volte visto che la var static non può essere creata due volte. Questo e' un errore, visto che questo e' quello che succede:

    - la funzione viene lanciata la prima volta e viene allocato spazio nel BSS per la var static (settata a 0)

    - La funzione ritorna la var static

    - quando viene richiamata la var non viene allocata di nuovo, ma la dicitura
    static Singleton s, fa intendere al compilatore che nell prossime operazioni ci stiamo sempre riferendo alla s statica. Intanto il suo valore è sempre lo stesso, non muta.

    Spero di essere stato chiaro, se intendevi altro fammelo sapere.

    bye
    There are 10 kinds of people in the world: who knows the binary numeration and who not

  3. #13
    Per evitare cio` bisognerebbe agire, a livello di accesso, anche sul costruttore di copia.

  4. #14
    Lo scopo del singleton è proprio quello che ci dimostra TGW, lavorare sempre su un unico oggetto in memoria, non evitare di avere due variabili che vi si riferiscono, cosa che si potrebbe comunque evitare con un contatore statico e un metodo statico Release() il quale debba essere chiamato sotto pena di throw prima di potere chiamare Get per la seconda volta, anche se non avrebbe molto senso farlo.

  5. #15
    Dimenticavo, non basterebbe ancora quanto ho detto, bisorrebbe anche ridefinire l'operatore di copia come detto anche da r0x, ma ripeto, sarebbe solo accademia, in pratica non ci vedrei utilità.

  6. #16
    Concordo. Di conseguenza vedrei il singleton più significativo a livello di puntatori/heap e memoria condivisa con, ad esempio, reference counting, come detto da Andrea.

  7. #17
    Utente di HTML.it L'avatar di Mods
    Registrato dal
    Jun 2004
    Messaggi
    302
    codice:
    class Singleton { 
      private static boolean isFirst=true;
      Singleton() { }
    public: 
      static Singleton& Get() { 
        if(isFirst){
           static Singleton s; 
           isFirst=false;
           return s; 
        }
        else 
           return NULL;
      } 
    };
    Ci sono 10 tipi di persone al mondo: quelli che conoscono il codice binario, e quelli che non lo conoscono!

  8. #18
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    23,923
    "BUMP!"

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.