Ich möchte eine statische Elementvariable im Konstruktor einer bestimmten Instanz initialisieren. Ist das eine schlechte Idee?Initialisieren statischer Member innerhalb des Konstruktors einer Instanz
Die Situation ist wie folgt. Ich habe eine statische Elementvariable, die alle Instanzen dieser Klasse teilen sollten. Normalerweise würde ich nur einen statischen Initialisierer verwenden. Aber ich habe nicht die notwendigen Informationen, um das statische Objekt zu konstruieren, bis der Konstruktor aufgerufen wird. Aber natürlich möchte ich nicht jedes Mal, wenn der Konstruktor aufgerufen wird, ein neues Objekt erstellen, also möchte ich so etwas machen.
class Foo
{
static Bar * bar;
Foo(Xyz xyz);
};
Bar * Foo::bar = nullptr;
Foo::Foo(Xyz xyz)
{
if (Foo::bar == nullptr)
{
// initialize static bar
Foo::bar = new Bar(xyz);
}
}
ich natürlich wissen xyz
migth für verschiedene Anrufe an den Konstruktor Foo
unterschiedlich sein. Das ist mir egal.
Ist das schlechte Software-Design? Ich fühle mich etwas komisch, ein statisches Objekt im Konstruktor zu initialisieren. Aber es ist nicht so anders als das Singleton Designmuster. Also vielleicht ist es ok?
EDIT
Danke für die Kommentare Jungs. Es scheint, dass die Leute kein Fan dieses Designs sind. Ich werde es so ändern, dass ich ein Bar
einmal vor der allerersten Instanz von Foo
erstelle und einen Bar *
als Parameter in Foo
's Konstruktor übergebe. Jede Foo
wird einen Zeiger auf eine Bar
haben, und ich werde sicherstellen, dass alle Foo
s alle auf die gleiche Bar
zeigen. Ist das besser?
Sie beachten, dass Sie nicht Initialisierung tun. Sie werden Aufgabe tun. – NathanOliver
Wie erhalten Sie den Wert, der für _initialization_ verwendet werden sollte? Ist es nur zur Laufzeit verfügbar? BTW Sie Probe wird nicht kompilieren. –
Einzelgewinde sieht OK aus. Multi-Thread-Race-Zustand. –