Domanda

Quello che voglio fare: eseguire del codice prerequisito ogni volta che un'istanza della classe sta per essere utilizzato all'interno di un programma. Questo codice verifica la presenza di requiremts ecc e deve essere eseguito solo una volta.

Ho trovato che questo può essere realizzato utilizzando un altro oggetto come variabile statica all'interno un costruttore. Ecco un esempio per una migliore immagine:

class Prerequisites
{
     public:
         Prerequisites() {
              std::cout << "checking requirements of C, ";
              std::cout << "registering C in dictionary, etc." << std::endl;
         }
};


class C
{
    public:
         C() {
             static Prerequisites prerequisites;
             std::cout << "normal initialization of C object" << std::endl;
         }
};

Quello che mi preoccupa è che non ho visto uso simile delle variabili statiche finora. Ci sono degli svantaggi o effetti collaterali o mi sto perdendo qualcosa? O forse c'è una soluzione migliore? Eventuali suggerimenti sono i benvenuti.

È stato utile?

Soluzione

Questo non è thread-safe, poiché se due thread tentano di costruire C per la prima volta nello stesso tempo, prerequisiti sarà probabilmente inizializzata due volte.

Se si sta bene con quello, probabilmente si può fare questo, anche se il sistema di gioco del costruttore con ambito ha zero reperibilità (cioè una volta che si dimentica il 'trucco' o altri cercare di leggere il codice, essi saranno confusi da cosa sta succedendo).

Altri suggerimenti

  

Ci sono degli svantaggi o effetti collaterali o mi sto perdendo qualcosa? O forse c'è una soluzione migliore? Eventuali suggerimenti sono i benvenuti.

Potrebbe essere più chiaro (anche se più prolisso) esplicitamente invocare un metodo statico.

class Prerequisites
{
    static bool checkedOnce;    
public:
    static void checkOnce() {
        if (checkedOnce)
        {
            //already checked: don't check again
            return;
        }
        //else check them now
        checkedOnce = true;
        std::cout << "checking requirements of C, ";
        std::cout << "registering C in dictionary, etc." << std::endl;
    }
};

bool Prerequisites::checkedOnce = false;

class C
{
public:
    C() {
        Prerequisites::checkOnce();
        std::cout << "normal initialization of C object" << std::endl;
    }
};

Si dovrebbe almeno usare un mutex e una bandiera statica all'interno della classe prerequisiti per agains protegga l'inizializzazione multiplo di Prerequisiti oggetti. In questo modo il codice diventerà thread-safe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top