Question

Ce que je veux faire: exécuter un code préalable chaque fois instance de la classe va être utilisé à l'intérieur d'un programme. Ce code vérifiera requiremts etc. et doit être exécuté qu'une seule fois.

Je trouve que cela peut être réalisé en utilisant un autre objet comme variable statique dans un constructeur. Voici un exemple pour une meilleure image:

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

Ce qui me dérange est que je ne l'ai pas vu une utilisation similaire de variables statiques jusqu'à présent. Y a-t-il des inconvénients ou des effets secondaires ou suis-je manque quelque chose? Ou peut-être il y a une meilleure solution? Toutes les suggestions sont les bienvenus.

Était-ce utile?

La solution

Ceci est thread-safe, car si deux threads essaient de construire C pour la première fois en même temps, Pré-requis sera probablement initialisé deux fois.

Si vous êtes d'accord avec cela, vous pouvez probablement le faire, bien que le système de jeu constructeur scope a zéro la possibilité de découvrir (une fois que vous oublier le « truc » ou d'autres essayer de lire votre code, ils seront déroutés à ce qui se passe).

Autres conseils

  

Y at-il des inconvénients ou des effets secondaires ou suis-je manque quelque chose? Ou peut-être il y a une meilleure solution? Toutes les suggestions sont les bienvenus.

Il est peut-être plus clair (bien plus bavard) explicitement appeler une méthode de statique.

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

Vous devriez au moins utiliser un mutex et un drapeau statique à l'intérieur Préalables classe pour protéger agains initialisation de plusieurs objets Pré-requis. De cette façon, votre code deviendra thread-safe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top