Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

21

21.06.2006, 10:55

Natürlich... nur ist es imo angenehmer mit nichtstatischen Membern zu arbeiten... Vor allem wenns so eine elegante Lösung wie Singletons gibt...
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Beliah

Treue Seele

Beiträge: 115

Wohnort: Söhlde - LK Hildesheim

Beruf: FI-Anwendungsentwicklung

  • Private Nachricht senden

22

21.06.2006, 11:00

Ausserdem kann ein Mensch ziemlich vergesslich sein und vielleicht bei einer Variable nicht daran denken das man diese statisch machen muss. Und wenn das dann erst entdeckt wird nachdem versucht wurde zu kompilieren, was je nach größte des Codes einige Zeit dauern kann, wirst du dir dann überlegen ob Singletons nicht doch einfacher sind...
Debuggers don't remove bugs, they only show them in slow motion.

Google Suche ohne Werbung und Cookies: Scroogle

Derzeitige(s) Freizeitprojekt(e)

alexm

Frischling

Beiträge: 71

Wohnort: Wien

  • Private Nachricht senden

23

21.06.2006, 11:13

hmmmm ... *grübel* da muss es doch noch irgendeinen Grund
dafür geben. Das mit der Vergesslichkeit ist ja gut und schön
aber von dem dürfen wir nicht ausgehen denke ich.
Hats eventuell mit Vererbung was zu tun? Aber die STAIC Sachen bleiben doch auch bei einer Vererbung 'unique' oder?

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

24

21.06.2006, 12:28

Es gibt schon gute Gründe für einen Singleton.

Erstmal ist ein Singleton von der Struktur her schön objektorientiert. Wenn man das alles über static Methoden abbildet, verwässert man diese Struktur ein wenig. Ausserdem handelt es sich um ein Design Pattern, das jeder, der die entsprechende Literatur kennt, auch wiedererkennen kann.

Zusätzlich spart man sich einiges an Tipparbeit, weil jede statische Mitgliedsvariable einer Klasse irgendwo auch definiert werden muss. Das vergisst man leicht und es ist eigentlich unnötig.

Richtig toll wird es, wenn die Singleton Klasse selbst nur ein Interface ist, und man mit "GetInstance ()" einen Zeiger auf eine abgeleitete Klasse bekommt. Ich mach mal ein rudimentäres Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class CAbstractRenderer
{
private:

  static CAbstractRenderer* _instance;

public:

  static CAbstractRenderer* getInstance ();

  virtual void render () = 0; // pur virtuelle Methode

};

class CD3DRenderer : public CAbstractRenderer
{
public:

  virtual void render (); // Renderer in D3D

};

class CGLRenderer : public CAbstractRenderer
{
public:

  virtual void render (); // Renderer in OpenGL

};

CAbstractRenderer* CAbstractRenderer::_instance = NULL;

CAbstractRenderer* CAbstractRenderer::getInstance ()
{
  if (NULL != _instance)
    return _instance;

  if (isD3DSystem ())
    _instance = new CD3DRenderer ();
  else if (isGLSystem ())
    _instance = new CGLRenderer ();

  if (NULL == _instance)
    throw std::exception ();

  return _instance;
}

"GetInstance ()" liefert jetzt je nach Systemmtyp einen Renderer, der für D3D oder OpenGL rendert, ohne dass man das ständig selbst prüfen müsste.
Hier hat man natürlich keine andere Wahl, als einen Zeiger auf die Instanz zu liefern, weil sonst die virtuelle Methode nicht funktioniert.

Auf GameDev.net gibt es auch noch einen Artikel, der sich mit dem Meyer Singleton beschäftigt und auch nochmal ein paar Risiken und Probleme beleuchtet (auf englisch): http://www.gamedev.net/reference/articles/article1825.asp

MfG,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

alexm

Frischling

Beiträge: 71

Wohnort: Wien

  • Private Nachricht senden

25

22.06.2006, 10:57

Super Beispiel mit dem Renderer, finde ich!!


Dem Artikel nach wäre es also so oder so vernünftiger, wenn man seine Applikation etwa so aufbaut:

Quellcode

1
2
3
4
5
6
7
- APP_BaseClass +
                |
                + Gfx_objectManager
                + Sfx_objectManager
                + Gfx_Mover
                + Sfx_Player
                + Renderer


somit wäre eigentlich dann nur die APP_BaseClass ein Singleton und alles andere können normale Klassen sein.
Was meint ihr?

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

26

22.06.2006, 12:10

Das passende Pattern zu dem was du beschreibst, nennt man auch Factory. In dem Fall kommst du aber nicht mehr mit einer einzelnen "GetInstance ()" Methode aus, sondern du brauchst die Möglichkeit zu unterscheiden, welches konkrete Objekt du eben haben willst. ("GetObjectManager ()", "GetSoundManager ()", "GetRenderer ()", ...)

Das kann ganz nett sein, wenn man sonst sehr viele Singleton-Instanzen hat, die man alle von Hand wieder freigeben muss; das könnte so in einer einzelnen Methode gebündelt werden. (Alle Instanzen, die tatsächlich auch angefragt worden, wieder freigeben) Im Sinne eines ordentlichen Resourcen-Management macht das unmittelbar sinn.

Für eine API, die in mehrere Teile aufgesplittet ist, wäre so ein Design aber ungeschickt, weil man dann nie in der Lage wäre, die einzelnen Teile unabhängig voneinander zu betreiben.

Wie immer kommt es also darauf an, was man am Ende machen will, und wieviel Arbeit man dafür investieren will.

MfG,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

alexm

Frischling

Beiträge: 71

Wohnort: Wien

  • Private Nachricht senden

27

22.06.2006, 14:09

ah dafür ist also das factory ...
nun bei meinem jetzigen projekt tu ich mir das glaub ich nimmer an.
ich erzeuge alles in der winMain und lösche es dann dort auch.

Werbeanzeige