Frage

Was ist der beste Weg, um ein statisches Mitglied in einer nicht vorlagerten Bibliotheksklasse zu haben, ohne die Belastung der Definition des Mitglieds auf dem Klassenbenutzer zu stellen?

sagen, ich möchte diese Klasse zur Verfügung stellen:

generasacodicetagpre.

Dann darf der Benutzer der Klasse nicht vergessen, das statische Mitglied irgendwo zu definieren (wie bereits antwortete Viele Zeiten ):

generasacodicetagpre.

Ich habe eine Antwort unten, aber es hat einige Nachteile.Gibt es bessere und / oder eher elegante Lösungen?

War es hilfreich?

Lösung

c ++ 17 und höher

Verwenden von generationstechnischen Initialisierungen für nicht dynamische Initialisierung:

generasacodicetagpre.

und Funktionsfunktion lokale statische Variablen verwenden Andernfalls:

generasacodicetagpre.

c ++ 14 und unter

Funktionsfunktion lokale Statik, da sie einfacher zu bedienen sind.

Wenn Sie aus irgendeinem Grund wirklich ein statisches -Datenmitglied wünschen, können Sie den Vorlagen-Trick verwenden:

generasacodicetagpre.

auf lokalen statik

für Ressourcen, die eine dynamische Initialisierung erfordern, ist es am besten, eine lokale Statik zu verwenden.

Die Reihenfolge, in der Datei-Scope- oder Class-Scope-Statik dynamisch initialisiert werden, ist im Allgemeinen nicht definiert, was zu dem statischen Initialisierungsauftrag Fiasko führt, wenn Sie versuchen, eine initialisierte Statik als Teil der Initialisierung eines anderen zu lesen. Lokale statische Lösen Sie das Problem, indem Sie in der ersten Verwendung initialisiert werden.

Es gibt jedoch einen leichten Aufwand, der örtliche Statik verwendet wird. Ab C ++ 11 ist die Initialisierung erforderlich, um fadensicher zu sein, was typischerweise bedeutet, dass jeder Zugriff von einem atomaren Lese- und von gut vorhergesagten Zweig gerichtet ist.

Andere Tipps

Meine eigene Lösung ist die Verwendung einer templatierten Halterklasse, da statische Mitglieder in Vorlagen fein arbeiten und diesen Inhaber als Basisklasse verwenden.

generasacodicetagpre.

Verwenden Sie jetzt die Halterklasse:

generasacodicetagpre.

Aber wie der Name des Mitglieds in der Inhaberklasse angegeben ist, können Sie denselben Halter nicht für mehr als ein statisches Mitglied verwenden.

AS von C ++ 17. Sie können jetzt Inline-Variablen dazu verwenden:

generasacodicetagpre.

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