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

riCo

Treue Seele

  • »riCo« ist der Autor dieses Themas

Beiträge: 165

Beruf: Student

  • Private Nachricht senden

1

14.06.2008, 10:52

Problem mit Singleton-Basisklasse

Hallo,
ich habe da mal ein kleines Problem mit 'ner Singleton-Basisklasse.

Hier die Singleton-Basisklasse:

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
        class ELYSIUM_API Singleton
        {
        public:
            static Singleton* exemplar();
            
        private:
            static Singleton *instanz;
            Singleton()  {}
            Singleton(const Singleton&);
            
            ~Singleton() {}

            class Waechter
            {
            public:
                ~Waechter()
                {
                    if(Singleton::instanz != 0)
                    {
                        delete Singleton::instanz;
                    }
                }
            };
            
            friend class Waechter;
        };
        
        Singleton* Singleton::instanz = 0;
        
        Singleton* Singleton::exemplar()
        {
            static Waechter w;
            
            if(instanz == 0)
            {
                instanz = new Singleton();
            }
            
            return instanz;
        }


Hier meine Klasse, die später Singleton sein soll:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
    // *** Basic Engine-class ***

    class ELYSIUM_API CElysium : public Singleton
    {
    public:
        int init();
        
        
    private:
        
        
    };


Leider funktioniert das ganze nicht wie gedacht. Er wirft die Warnung:
warning C4624: 'elysium::CElysium': Der Destruktor konnte nicht generiert werden, da ein Basisklassen-Destruktor nicht zugreifbar ist.

zusätzlich wirft er mir noch ne Linker-warnung, die denke ich aber resultiert aus dem Fehler:
elys_engine.obj : error LNK2005: "public: static class elysium::elysium::Utilities::Singleton * __cdecl elysium::elysium::Utilities::Singleton::exemplar(void)" (?exemplar@Singleton@Utilities@elysium@3@SAPAV1233@XZ) ist bereits in elys_window.obj definiert.
Wir leben alle unter dem Sternenhimmel, aber wir haben nicht alle den gleichen Horizont.

Anonymous

unregistriert

2

14.06.2008, 11:03

Du musst wenn schon einen Template-Singleton dafür erstellen:
http://geeklab.wikidot.com/cpp-singleton-template

Ich weiß aber beim besten Willen nicht, wieso sich diese Heap-Version des Singletons so dermaßen verbreitet wie Gift.

Such mal bei einer Suchmaschine nach dem Meyers-Singleton, das ist was besseres. Denn dein Singleton hat den Nachteil: Du reservierst Speicher, doch wo gibst du ihn frei? C++ hat keinen GC.

Meyers-Singleton als Template ist viel viel besser, da er kein new/delete benutzt. Oder noch besser, hol dir sein Buch: Effektiv C++ Programmieren.


Benjamin Kaufmann hat in seiner sehr bekannten FAQ mal was dazu geschrieben, was du dir umbedingt mal durchlesen solltest:
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=Singleton#Answ

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

14.06.2008, 11:13

Zitat von »"unsigned long"«

Denn dein Singleton hat den Nachteil: Du reservierst Speicher, doch wo gibst du ihn frei? C++ hat keinen GC.

Er gibt ihn doch wieder frei ... wenn der Wächter zerstört wird.

Anonymous

unregistriert

4

14.06.2008, 11:18

David Scherfgen
Also wenn man sowas freigeben nennt bei dem recht konfusen Design, ich wäre mir da nicht so sicher.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

14.06.2008, 11:22

Zitat von »"unsigned long"«

David Scherfgen
Also wenn man sowas freigeben nennt bei dem recht konfusen Design, ich wäre mir da nicht so sicher.


Doch, er gibt ihn frei. Allerdings hat das den selben Effekt wie das Meyers-Singleton, nur das er zusätzlich Speicher braucht und eine (langsame) Allokation auf dem Heap hat.

Edit:
@Poster:
Mach deinen Destruktor geschützt, dann klappts auch.
@D13_Dreinig

riCo

Treue Seele

  • »riCo« ist der Autor dieses Themas

Beiträge: 165

Beruf: Student

  • Private Nachricht senden

6

14.06.2008, 11:41

Ich hatte es vorher über eine andere templatebasierte Singleton-Klasse versucht, aber das Ergebnis war nicht zufriedenstellend. Werde es jetzt mal auf die neue Klasse umstellen. Übrigens: Das allokieren über new könnte ich auch mit ner statischen Variable übergehen, weil sich über das löschen beschwert wurde..
Wir leben alle unter dem Sternenhimmel, aber wir haben nicht alle den gleichen Horizont.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

14.06.2008, 11:42

Zitat von »"riCo"«

Übrigens: Das allokieren über new könnte ich auch mit ner statischen Variable übergehen, weil sich über das löschen beschwert wurde..


Genau, wieso machst du das denn nicht?
@D13_Dreinig

riCo

Treue Seele

  • »riCo« ist der Autor dieses Themas

Beiträge: 165

Beruf: Student

  • Private Nachricht senden

8

14.06.2008, 12:05

Ich wollte es erstmal mit irgendeiner Singleton-Variante hinbekommen. :)
Wir leben alle unter dem Sternenhimmel, aber wir haben nicht alle den gleichen Horizont.

9

14.06.2008, 14:17

Brauchst du denn ein Singleton, oder reicht ein einfacher namespace? Weisst du, was du da tust? (Diese Fragen sollte jeder fuer sich beantworten, sonst wird das ein sehr langer Thread). Ob es nun ein Singleton von Meyers oder sonstwem ist, alle sind sie gleich gut, oder schlecht. Und der Heap, egal, da es fuer gewoehnlich nur einmal erstellt wird.

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

10

14.06.2008, 14:19

Zitat von »"knivil"«

Brauchst du denn ein Singleton, oder reicht ein einfacher namespace?
Was haben Singletons mit Namespaces zu tun?

Werbeanzeige