static class



  • statische Konstruktoren und Destruktoren :p



  • Kellerautomat schrieb:

    statische Konstruktoren und Destruktoren :p

    Ja ja, nur bitte nicht so wie du sie vor hast. 🤡



  • cooky451 schrieb:

    Michael E. schrieb:

    Hast du schon mal ein sinnvolles Singleton gebaut?

    Sicher. Nehmen wir z.B. mal WSAStartup() und WSACleanup(). Das eine muss ich vor dem Erstellen des ersten Sockets ausführen, das andere am Ende des Programms. Für sowas baue ich halt ein kleines unsichtbares Singleton. Ich könnte natürlich auch eine normale Klasse nehmen und ne globale Variable davon anlegen, aber es ist ja nun mal klar ersichtlich und erforderlich, dass nur genau eine Instanz dieser Klasse existiert. Aber wenn du eine schöne Alternative kennst, immer her damit.

    Jedes Socket kann das für sich machen, WSAStartup() und WSACleanup() zählen mit.



  • TyRoXx schrieb:

    cooky451 schrieb:

    Michael E. schrieb:

    Hast du schon mal ein sinnvolles Singleton gebaut?

    Sicher. Nehmen wir z.B. mal WSAStartup() und WSACleanup(). Das eine muss ich vor dem Erstellen des ersten Sockets ausführen, das andere am Ende des Programms. Für sowas baue ich halt ein kleines unsichtbares Singleton. Ich könnte natürlich auch eine normale Klasse nehmen und ne globale Variable davon anlegen, aber es ist ja nun mal klar ersichtlich und erforderlich, dass nur genau eine Instanz dieser Klasse existiert. Aber wenn du eine schöne Alternative kennst, immer her damit.

    Jedes Socket kann das für sich machen, WSAStartup() und WSACleanup() zählen mit.

    Nope.

    Nur weil aktuell kein Socket offen ist, will ich ja nicht zwangsläufig WSACleanup aufrufen. Etwas Singleton-artiges ist hier schon korrekt.



  • weicher schrieb:

    Seitdem die Schnittstelle klar und es schlicht nicht mehr möglich ist mehrere Instanzen zu erzeugen funktioniert es auch.

    Aber du bist doch derjenige, der den fremden Code aufruft oder nicht? Wenn du beim Aufruf eine Messsysteminstanz übergibst, muss der aufgerufene Code auch die Messsysteminstanz annehmen. Verwirft er die dann oder was? Wenn ich eine Messsysteminstanz übergeben bekomme, komme ich doch nicht auf die Idee und erstelle mir eine eigene Instanz.



  • cooky451 schrieb:

    Nehmen wir z.B. mal WSAStartup() und WSACleanup(). Das eine muss ich vor dem Erstellen des ersten Sockets ausführen, das andere am Ende des Programms. Für sowas baue ich halt ein kleines unsichtbares Singleton. Ich könnte natürlich auch eine normale Klasse nehmen und ne globale Variable davon anlegen, aber es ist ja nun mal klar ersichtlich und erforderlich, dass nur genau eine Instanz dieser Klasse existiert. Aber wenn du eine schöne Alternative kennst, immer her damit.

    Ich hab noch nie mit Sockets gearbeitet, weshalb ich nachfragen muss: Was spricht dagegen, WSAStartup beim Starten des Programms aufzurufen? Sprich WSAStartup als Erstes und WSACleanup als Letztes in der main.



  • Hallo Michael,

    Aber du bist doch derjenige, der den fremden Code aufruft oder nicht?

    Lies meinen letzen Post noch einmal sorgfältig durch.

    Normalerweise macht man in Komponenten in etwa folgendes:

    MeasSystem* measure = Object<MeasSystem> (_T("MeasSystem"));
      assert (measure != NULL);
      if (measure->GoOnline ())
      {
        ...
      }
    

    Da beim testen einer Komponente noch kein MessSystem existiert schlägt der
    assert (measure != NULL) zu.

    Was macht also der bequeme Programmierer (gibt's auch andere? 😉 )

    MeasSystem* measure = CreateObject<MeasSystem> ();
      assert (measure != NULL);
      if (measure->GoOnline ())
      {
        ...
      }
    

    Dann läuft sein Test...

    Herzliche Grüsse
    Walter



  • Michael E. schrieb:

    cooky451 schrieb:

    Nehmen wir z.B. mal WSAStartup() und WSACleanup(). Das eine muss ich vor dem Erstellen des ersten Sockets ausführen, das andere am Ende des Programms. Für sowas baue ich halt ein kleines unsichtbares Singleton. Ich könnte natürlich auch eine normale Klasse nehmen und ne globale Variable davon anlegen, aber es ist ja nun mal klar ersichtlich und erforderlich, dass nur genau eine Instanz dieser Klasse existiert. Aber wenn du eine schöne Alternative kennst, immer her damit.

    Ich hab noch nie mit Sockets gearbeitet, weshalb ich nachfragen muss: Was spricht dagegen, WSAStartup beim Starten des Programms aufzurufen? Sprich WSAStartup als Erstes und WSACleanup als Letztes in der main.

    Prinzipiell nichts. Bis auf dass es bei portablen Libraries halt unpraktisch ist.
    Wenn es aber eine reine Win32 Anwendung ist, spricht nichts dagegen. Es sei denn natürlich man erstellt einen Socket vor main()...



  • In Bezug auf die Socket-Geschichte sehe ich nicht, was man durch ein Singleton gewinnt. Bau eine kleine RAII-Klasse, die WSA* mamangt, dann kannst du sie socketweise benutzen oder dir irgendwo eine globale Konstante hinkloppen, wenn du lustig bist. Sie künstlich auf eine Instanz zu beschränken macht für mich keinen Sinn.

    Ansonsten gelten alle Vorbehalte gegen globale Variablen uneingeschränkt auch bei Singletons.



  • seldon schrieb:

    In Bezug auf die Socket-Geschichte sehe ich nicht, was man durch ein Singleton gewinnt. Bau eine kleine RAII-Klasse, die WSA* mamangt, dann kannst du sie socketweise benutzen oder dir irgendwo eine globale Konstante hinkloppen, wenn du lustig bist. Sie künstlich auf eine Instanz zu beschränken macht für mich keinen Sinn.

    Nope. Geht nicht wenn du Sockets jederzeit initialisieren willst. Man verwendet den Singleton einfach nur dafür, dass die Initialisierung stattfindet sobald sie gebraucht wird. Da gibts nix auszusetzen.

    Nennen wir es statt Singleton einfach das Initialization-on-demand holder idiom oder Construct on First Use Idiom und fertig 😉



  • Für Logdateien benutze ich auch Singletons. (Ein Log pro Programminstanz)

    EDIT: Mir fallen aber noch Einsätze ein, die eher schlecht sind, wie ein Gott Objekt Singleton. (Es kann nur einen geben! :D)



  • Nicht zu vergessen, wir leben in keiner perfekten Welt, oftmals bekommen wir auch Designfehler vererbt.
    Wenn eine Lib / Framework Singleton like Functionalitaet vorschreibt, wird man selbst auch kaum drumherumkommen ...

    Und so unbeliebt ist der Singleton-Ansatz bei frameworks scheinbar gar ned ...

    Ciao ...


Anmelden zum Antworten