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

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

1

08.04.2009, 14:46

Problem mit Singleton

Hallo,
ihr kennt sicher die Singleton-Klasse aus dem Buch:

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
#ifndef SINGLETON_HPP
#define SINGLETON_HPP

template <class T> class TSingleton
{
    public:
    virtual ~TSingleton() { }

    inline static T *Get()
    {
        if (!m_pSingleton)
            m_pSingleton = new T;

        return (m_pSingleton);
    }

    static void Del()
    {
        if (m_pSingleton)
        {
            delete (m_pSingleton);
            m_pSingleton = NULL;
        }
    }

    protected:
    static T *m_pSingleton;
};

// Create static var

template <class T> T *TSingleton<T>::m_pSingleton = 0;

#endif

Hier bekomme ich relativ oft (meistens wenn ich irgendeine neue Klasse erstelle und benutze) einen Fehler der wie folgt aussieht:
in der Zeile mit: m_pSingleton = new T;
kommt
error: no matching function for call to `CGame::CGame()'
note: candidates are: CGame::CGame(const CGame&)
CGame ist meine Hauptklasse, welche von TSingleton abgeleitet ist.
Allerdings funktioniert das sonst immer ganz normal, und ich verstehe auch nicht, was ich da ändern soll... Meistens kriege ich den Fehler (von dem ich nicht verstehe wie er zustande kommt) weg, indem ich so lange mit den #includes etc rumspiele, bis es auf einmal funktioniert... :shock: :?
Kennt jemand vielleicht diesen Fehler oder kann sich denken, woher das kommt? Ich würde jetzt hier nur ungern das komplette Zusammenspiel all meiner Klassen und Dateien erklären... falls jemand mit Ahnung sich mein Programm mal ansehen möchte (ich denke der Fehler ist mit viel Ahnung sicher schnell zu finden :D) kann ich demjenigen mal alles schicken (bzw. nen link geben)... allerdings würde ich jetzt ungern meinen kompletten Code öffentlich zugänglich machen :D

Anonymous

unregistriert

2

08.04.2009, 15:19

http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=Singleton#Answ

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

3

08.04.2009, 15:40

hhmmm ja, was ein Singleton ist, und wie es funktioniert wußte ich schon... die verschiedenen versionen waren mir da zwar nicht bekannt, aber im Prinzip machen sie ja das gleiche...
Ich verstehe aber auch nicht, was das mit meinem Fehler zu tun hat... weil normalerweise funktioniert es... alles was ich gemacht habe, ist eine private variable von CGame, welche vorher vom typ sf::Clock war, durch CPauseClock ersetzt habe, damit ich diese auch pausieren kann... natürlich habe ich dafür #include "PauseClock.hpp" einbinden müssen, aber sonst nichts gemacht, wenn ich das einbinden und die typ-änderung rückgängig mache, geht alles... deshalb verstehe ich nicht, was das mit dem Singleton zu tun haben kann ^^

Edit: ich kann sogar die klasse einbinden und es läuft, erst wenn ich sf::Clock durch CPauseClock ersetze, kommt dieser merkwürdige Fehler...
Edit2: Ich habe keine Ahnung warum, aber nachdem ich jetzt den Konstruktor von CPauseClock geändert habe, sodass er keine Parameter mehr erwartet, funktioniert es -.-' Irgendwie logisch, aber die Fehlermeldung hat damit ja garnix zu tun....

4

08.04.2009, 18:04

Die Singeltonkalsse versucht das Objekt zu erstellen was nicht geht, da das Objekt nur Konstruktoren hat, die Parameter erwarten, aber die Singletonklasse keine Parameter an den Konstruktor des objektes, das sie erstell, übergibt.
Du hast also eine "Funktion" die Parameter braucht, du übergibts aber keine, folglich kann das nicht funktionieren.
Durch die Templates ist das ganze natürlich nicht auf den ersten Blick zu sehen, ich gehe einfach mal davon aus, dass du die Singeltonklasse noch gar nicht so vollständig verstanden hast, beziehungsweise den template Teil dieser Klasse.
Lieber dumm fragen, als dumm bleiben!

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

5

09.04.2009, 02:22

Doch doch, das hab ich insofern schon verstanden... nur habe ich einfach nicht dran gedacht,dass der neue konstruktor jetzt einen Parameter hat... im Nachhinein ist das natürlich vollkommen logisch, nur hat die Fehlermeldung nur sehr indirekt etwas damit zu tun gehabt ^^...
Im Kontext der Vererbung hat er mir im Prinzip 2 "Ebenen" zu weit oben einen Fehler ausgespuckt... sowas verwirrt natürlich ungemein, wenn man noch nicht so sicher in der Sprache ist ^^

Werbeanzeige