Pregunta

Lo que quiero hacer: ejecutar un código pre-requisito cada vez instancia de la clase va a ser utilizado dentro de un programa. Este código comprobará requiremts etc., y debe funcionar sólo una vez.

he encontrado que esto se puede conseguir utilizando otro objeto como variable estática dentro de un constructor. Aquí está un ejemplo para una mejor imagen:

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;
         }
};

Lo que me molesta es que no he tenido un uso similar de las variables estáticas hasta el momento. ¿Hay desventajas o efectos secundarios o me estoy perdiendo algo? O tal vez hay una solución mejor? Cualquier sugerencia es bienvenida.

¿Fue útil?

Solución

Esto no es seguro para subprocesos, ya que si dos subprocesos intentan construir C por primera vez, al mismo tiempo, Requisitos previos probablemente será inicializado dos veces.

Si usted está de acuerdo con eso, es probable que pueda hacer esto, aunque el sistema de juego de ámbito de constructor tiene cero detectabilidad (es decir, una vez que se olvide el 'truco' o demás tratar de leer el código, van a estar desconcertados por lo que está pasando).

Otros consejos

¿Hay desventajas o efectos secundarios o me estoy perdiendo algo? O tal vez hay una solución mejor? Cualquier sugerencia es bienvenida.

Podría ser más clara (aunque más detallado) a explícitamente invocar un método estático.

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;
    }
};

, al menos, debería utilizar un mutex y una bandera estática dentro de la clase Requisitos previos para agains protect inicialización múltiplo de Requisitos objetos. De esta manera el código será segura hilo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top