Frage

Was ich tun möchte: Eine Voraussetzung Code ausführen, wenn Instanz der Klasse innerhalb eines Programms werden wird verwendet. Dieser Code wird für requiremts überprüfen usw. und sollte nur einmal ausgeführt werden.

Ich fand, dass dies ein anderes Objekt als statische Variable in einem Konstruktor erreicht werden kann. Hier ist ein Beispiel für ein besseres Bild:

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

Was mich stört, ist, dass ich nicht eine ähnliche Verwendung von statischen Variablen bisher gesehen haben. Gibt es irgendwelche Nachteile oder Nebenwirkungen oder bin ich etwas fehlt? Oder vielleicht gibt es eine bessere Lösung? Alle Vorschläge sind willkommen.

War es hilfreich?

Lösung

Dies ist nicht Thread-sicher, da, wenn zwei Threads versuchen, C zum ersten Mal in der gleichen Zeit zu konstruieren, werden Voraussetzungen wahrscheinlich zweimal initialisiert werden.

Wenn Sie in Ordnung mit, dass, können Sie wahrscheinlich dies tun, obwohl das scoped Konstruktor System Gaming Null Auffindbarkeit hat (dh, wenn Sie den ‚Trick‘ vergessen oder andere versuchen, den Code zu lesen, werden sie als zu verwirrt werden was los ist).

Andere Tipps

Gibt es irgendwelche Nachteile oder Nebenwirkungen oder bin ich etwas fehlt? Oder vielleicht gibt es eine bessere Lösung? Alle Vorschläge sind willkommen.

Es könnte klarer sein (obwohl ausführlicher) explizit aufrufen, um eine statische Methode.

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

Sie sollten mindestens einen Mutex verwenden und eine statische Flagge innerhalb Voraussetzungen Klasse zu schützen agains mehrere Initialisierung von Voraussetzungen Objekte. Auf diese Weise wird Ihr Code Thread-sicher sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top