Problem mit der Singleton-Klasse [solved]
-
Ich versuche jetzt schon ne ganze Weile folgende main.cpp zu kompilieren, aber es scheitert immer daran daß der Kompiler die "pointerFramework" nicht erkennt.
Meines Erachtens nach müsste aber alles stimmen...
Kann mir jemand sagen wo da der Fehler liegt?
//Datei: main.cpp #include "Framework.hpp" #include "Game.hpp" int main( int argc, char *argv[]) { if (pointerFramework->init(800, 600, 16, true)==false) return (0); Game CurrentGame; CurrentGame.init(); CurrentGame.run(); CurrentGame.quit(); pointerFramework->quit(); pointerFramework->del(); return (0); }//Datei: Framework.hpp #ifndef FRAMEWORK_HPP #define FRAMEWORK_HPP #include <iostream> #include "Singleton.hpp" #include "Clock.hpp" using namespace std; #define pointerFramework Framework::Get(); class Framework : public Singleton<Framework> { public: bool init (int screenWith, int screenHeight, int colorDepth, bool fullscreen); void quit(); void update(); void clear(); void flip(); bool keyDown(int keyID); SDL_Surface *GetScreen() {return pointerScreen;} private: SDL_Surface *pointerScreen; Uint8 *pointerKeystate; }; #endif//DAtei: Singleton.hpp #ifndef SINGLETON_HPP #define SINGLETON_HPP template <class T> class Singleton { protected: // Membervariablen static T *m_pSingleton; // Statisches Objekt public: virtual ~Singleton () { } inline static T* Get () { // Existiert schon eine Instanz? if (!m_pSingleton) m_pSingleton = new T; // Nein, dann neue Instanz erzeugen // Zeiger auf die Instanz zurückgeben return (m_pSingleton); } static void Del () { // Gab es eine Instanz? if (m_pSingleton) { delete (m_pSingleton); // Ja, dann freigeben m_pSingleton = NULL; // und Zeiger auf NULL setzen } } // Del }; // Die statische Variable erzeugen // template <class T> T* Singleton<T>::m_pSingleton = 0; #endif
-
Moin.
#define pointerFramework Framework::Get();in Verbindung mit
if (pointerFramework->init(800, 600, 16, true)==false)führt zu
[cpp]
if (Framework::Get();->init(800, 600, 16, true)==false)
[cpp]und das ist definitiv ein Semikolon zu viel.
-
Der Strichpunkt bei deinem pointerFramework define muss weg. Allerdings würde ich dir nicht empfehlen dieses define zu benutzen. Bringt nur Ärger wie du siehst. Framework::Get() zu schreiben ist ja auch nicht so dramatisch
-
Exakt. Und da erkennt man dann wenigstens auch, was die Zeile macht: ERST ein Objekt holen und DANN darauf zugreifen. Die erste Version liest sich, als sei das Objekt irgendwo schon angelegt worden...
-
Danke. Typischer Anfängerfehler

-
Hallo
Vielleicht solltest du auch mal das komplette Schreiben des Wortes Pointer überdenken.
chrische
-
Mal sehen, ich kann nur garnicht auf "ungarisches" Codeobfuscating

-
Eine "class Framework" könnte auf falsches Design hinweisen

-
Ausserdem sind Makros ihbah, was spricht (wenn schon der Weg) gegen
inline Framework* pointerFramework { return Framework::Get(); }
-
Ich würde bei Get nur eine Referenz zurück geben,
da ja niemand den Pointer der Singelton instanz braucht.
-
Und mal wieder wurde das Singleton-Muster falsch eingesetzt.