Statischen variable in einem Konstruktor, gibt es irgendwelche Nachteile oder Nebenwirkungen?
Was ich will: führen Sie einige Voraussetzung-code, wenn Instanz der Klasse verwendet wird, innerhalb eines Programms. Dieser code prüft, ob requiremts etc. und sollte nur einmal ausgeführt werden.
Fand ich, dass dies erreicht werden kann, mit einem anderen Objekt als statische variable in einem Konstruktor. 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 habe nicht gesehen, eine ähnliche Verwendung von statischen Variablen so weit. Gibt es irgendwelche Nachteile oder Nebenwirkungen, oder bin ich etwas fehlt? Oder gibt es vielleicht eine bessere Lösung? Alle Vorschläge sind willkommen.
- Ich denke, Sie sollten überdenken Sie Ihren Entwurf, indem Sie stattdessen das nehmen, was prereq als argument an den Konstruktor übergeben. Es macht die Abhängigkeiten klarer für den Benutzer der Klasse.
- K: Das ist nicht etwa eine Wahl der Klasse user aber eher zu Test-runtime-Umgebung. Um genauer zu sein, möchte ich beispielsweise überprüfen, nach verfügbaren OpenGL-Erweiterungen, die C-Klasse. Wenn die erforderlichen Erweiterungen nicht verfügbar, das Programm wird einfach drucken Fehlermeldung aus und beendet sich mit Fehler.
- Was ich meinte war ein Benutzer (Programmierer) mit Ihrer Klasse. Es ist klar, wenn der Konstruktor muss wissen, die verfügbaren opengl-Erweiterungen dann leise hinter den kulissen.
- K: ich weiß was du meinst, aber das ist nicht der Fall. Class user (Programmierer) hat keine Ahnung, was
C
Klasse können müssen, da es im detail. Auf der anderen Seite C-Klasse weiß, was es braucht, sondern weil der OpenGL-design, wird diese geprüft werden kann nur während der Laufzeit. - Ja klar, dass ich möchte zeigen, während, die Sie gerne zu verbergen haben, persönlich, wenn ich andere Leute die Klassen mag ich eher geringes Gewicht, weil Sie dazu neigen, dann werden mehr wiederverwendbare aber jedem das seine.
- K: Es ist nicht so, dass ich gerne etwas verstecken. In meinem Fall wäre es einfach nur dumm zu entlarven Voraussetzungen der Klasse Benutzer.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist nicht thread-sicher, da, wenn zwei threads versuchen zu konstruieren C für die erste Zeit an der gleichen Zeit, Voraussetzungen, wird wohl initialisiert werden zweimal.
Wenn Sie in Ordnung sind, können Sie wahrscheinlich tun dies, obwohl die gaming-scoped Konstruktor system hat null Auffindbarkeit (d.h., wenn Sie vergessen, den 'trick' oder andere versuchen zu Lesen, Ihre Codes, Sie werden verblüfft, was vor sich geht).
Könnte es klarer sein (aber Ausführlicher) explizit aufrufen einer statischen Methode.
checkedOnce
boolean als statische innere checkOnce()? Weniger Ausführlichkeit und dennoch sollte klar sein (?). + Unteilbarkeit in C++0x.Sollten Sie mindestens einen mutex verwenden und ein statisch-flag im inneren Voraussetzungen der Klasse zum Schutz gegen die multiple Initialisierung der Voraussetzungen Objekte. Auf diese Weise Ihren code threadsicher.