Singelton Fehler
-
Hallo,
habe aufeinmal ein Problem mit Singeltons in meinem Spiel. Vorweg: Das Problem besteht nur an dieser Codestelle. Ich verwende noch woanders im Programm Singeltons und da funktioniert es. Komisch
Am besten ich Zeig erstmal die Fehlermeldung dann den Codeabschnitt und noch etwas drum herum.
error C2440: '=': 'CTimer *' kann nicht in 'float' konvertiert werden
1> Es gibt keinen Kontext, in dem diese Konvertierung möglich ist
1>Source\Menue.cpp(128): error C2143: Syntaxfehler: Es fehlt ';' vor '->'void CMenue::renderintro () { while (time < 5) { time = g_pTime->getframetime(); g_pFramework->pApp->Clear (); psprite_intrologo->render (); g_pFramework->pApp->Display (); } }Die Timer Klasse:
#ifndef _TIMER_ #define _TIMER_ #include <SFML/Window.hpp> #include "Singleton.h" #define g_pTime CTimer::Get (); class CTimer : public TSingleton<CTimer> { public: float getframetime (); private: sf::Clock Clock; float temp; }; #endifDie Singelton- Klasse obwohl ich nicht weiss was das für eine Rolle spielt weil wie gesagt im gleichen Programm nur an anderer Stelle funktioniert es:
#ifndef SINGLETON_HPP #define SINGLETON_HPP template <class T> class TSingleton { protected: // Membervariablen static T *m_pSingleton; // Statisches Objekt public: // Memberfunktionen // Destruktor // virtual ~TSingleton () { } // Get // // Aufgabe: Wenn nötig, statisches Objekt erzeugen und // Zeiger darauf zurückgeben // 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); } // Get // Statisches Objekt freigeben // 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* TSingleton<T>::m_pSingleton = 0; #endifWäre für einen Rat sehr dankbar. Sitze schon Tage davor.
Gruß
-
#define g_pTime CTimer::Get ();ohne Semikolon am Ende, sonst gehtg_pTime->Lalala();in die Hose.
-
#define g_pTime CTimer::Get (); time = g_pTime->getframetime();-->
time = CTimer::Get ();->getframetime();edit:
was ist eigentlich an einem kryptischeng_pTimeverständlicher als
Timer::Get()?
-
Du spielst zu viel mit defines!
-
Also erstmal danke an ipsec. Scheint zu funktionieren konnte leider bisher nur einmal kompilieren weil ich darauf Probleme mit dem Pc hatte.
@brotbernd Weil ich das so aus dem Buch von Heiko Kalista übernommen habe. Über Sinn und unsinn kann man sich streiten. Ist wohl gewöhnung.
@knivil hab ich schon öfters mal aufgeschnappt. was ist an defines so böse?
-
Errschaffer schrieb:
@knivil hab ich schon öfters mal aufgeschnappt. was ist an defines so böse?
defines sind simple, stupide Textersetzungen. Der Präprozessor ersetzt einfach jedes "g_pTime" durch "Timer::Get();", egal wie sinnig das ist, oder ob in diesem Kontext g_pTime eine ganz andere Bedeutung hat. Jede Datei, die den Header einbindet, wird mit dieser Ersetzung verseucht, ob gewollt oder nicht.
In deinem Fall hat ein define einfach keinen echten Mehrwert. Vor allem in Zeiten moderner Ides/Editoren, die sofort mit der passenden Completion aufwarten.
-
Errschaffer schrieb:
@knivil hab ich schon öfters mal aufgeschnappt. was ist an defines so böse?
Schau dir doch nochmal deine Frage an.
Sitze schon Tage davor.
Wieso? Wegen einem Makro. Hast Du ja jetzt an eigenem Leibe erfahren, was für blöde und schwer zu findene Fehler der Präprozessor erzeugen kann.