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
Zitat von »"knivil"«
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.
Zitat von »"knivil"«
Brauchst du denn ein Singleton, oder reicht ein einfacher namespace?
Zitat von »"knivil"«
Weisst du, was du da tust?
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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
// Elysium_Engine.h // #if defined _MSC_VER && _MSC_VER >= 1020 #pragma once #endif #ifndef __ELYSIUM_ENGINE_H_INCLUDED__ #define __ELYSIUM_ENGINE_H_INCLUDED__ // *** MACROS *** #ifdef ELYSIUM_DLL #define ELYSIUM_API __declspec(dllexport) #else #define ELYSIUM_API __declspec(dllimport) #endif // *** INCLUDES *** #include <windows.h> namespace elysium { #define ELYSIUM_DELETE_VARIABLE(x) (delete (x), x=NULL) #define ELYSIUM_DELETE_ARRAY(x) (delete[] (x), x=NULL) template<class C> class ELYSIUM_API Singleton { private: // Static current instance static C* CurrentInstance; public: // Current instance getter static C* Current() { if( Singleton<C>::CurrentInstance == NULL ) { Singleton<C>::CurrentInstance = new C; } return Singleton<C>::CurrentInstance; } // Delete current instance static void DeleteCurrent() { if( Singleton<C>::CurrentInstance != NULL ) { delete Singleton<C>::CurrentInstance; Singleton<C>::CurrentInstance = NULL; } } }; // *** Basic Engine-class *** class ELYSIUM_API CElysium : public Singleton<CElysium> //elysium::Utilities::Singleton<CElysium> { public: int init(); protected: }; } // end namespace elysium #endif // __ELYSIUM_ENGINE_H_INCLUDED__ // ************************************************************************************************** |
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 45 46 47 48 49 50 |
// game.cpp // #pragma comment(lib,"..\\debug\\Elysium_Engine.lib") #include <windows.h> #include <winuser.h> #include "elys_engine.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdParam, int iCmdShow) { UNREFERENCED_PARAMETER(hInstance); UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(szCmdParam); UNREFERENCED_PARAMETER(iCmdShow); MSG Message; // Engine und Spiel initialisieren. elysium::CElysium* pDieEinzigeInstanz = elysium::CElysium::Current(); //p->init(); // Nachrichtenschleife ZeroMemory(&Message, sizeof(MSG)); while(Message.message != WM_QUIT) { while(PeekMessage(&Message, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&Message); DispatchMessage(&Message); } // Bewegungen durchführen // Zeichnen } // Spiel beenden return (int)Message.wParam; } // ************************************************************************************************** |
C-/C++-Quelltext |
|
1 2 3 4 5 6 |
#if defined _MSC_VER && _MSC_VER >= 1020 #pragma once #endif #ifndef __ELYSIUM_ENGINE_H_INCLUDED__ #define __ELYSIUM_ENGINE_H_INCLUDED__ |
C-/C++-Quelltext |
|
1 2 3 4 5 6 |
#ifndef __ELYSIUM_ENGINE_H_INCLUDED__ #define __ELYSIUM_ENGINE_H_INCLUDED__ #if _MSC_VER >= 1020 #pragma once #endif |
Anonymous
unregistriert
C-/C++-Quelltext |
|
1 2 |
#define ELYSIUM_DELETE_VARIABLE(x) (delete (x), x=NULL) #define ELYSIUM_DELETE_ARRAY(x) (delete[] (x), x=NULL) |
C-/C++-Quelltext |
|
1 |
if (x != NULL) |
C-/C++-Quelltext |
|
1 2 |
template<class C> C* Singleton<C>::CurrentInstance = 0; |
Zitat von »"unsigned long"«
Dann stopf noch ein
rein, auch wenn delete NULL definiert ist, es heißt nicht das sich Compiler-Hersteller dran halten.
C-/C++-Quelltext
1 if (x != NULL)
Zitat von »"riCo"«
Ich habe das Problem gelöst. Die Templateklasse muss tatsächlich ohne ELYSIUM_API gekennzeichnet werden. Allerdings ist das nur die halbe Lösung. Das Problem war die statische Variable des Singletons.
C-/C++-Quelltext
1 2 template<class C> C* Singleton<C>::CurrentInstance = 0;
... löste das Problem.
Zitat von »"knivil"«
Und bevor alle gleich falsch und Bloedsinn schreinen, sollte erstmal ueber das Problem nachgedacht werden. Ja, ich weiss, was ich tue.
Zitat von »"knivil"«
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.
Zitat
Namespace - zu deutsch Namensraum kennzeichnet Einheiten die zusammengehören. zB ist die gesamt C++ Standard Library im namespace std zu finden. Namespace verhindern Namenskonflikte und teilen den Code in logische Einheiten auf. Kaum einer kennt die Standard Library wirklich auswendig. Es kann also passieren, dass man für eine Klasse einen Namen verwendet, den es bereits gibt -> das führt zu Problmen. Es muss ja auch kein Namenskonflikt mit der Standard Bibliothek sein, man kann ja auch mit anderen Bibliotheken solche Probleme bekommen.
In C verwendete man Prefixe, also statt class Integer, schrieb man class myInteger. Sowas ist aber auf dauer unbefriedigend.
Werbeanzeige