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
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
Class A { public: static ClassA* GetInstance(); Foo* GetFoo(); ... private: ClassA(); static ClassA* m_pSingleton; Foo* m_pFoo; ... } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
ClassA* ClassA::m_pSingleton = NULL; LRESULT CALLBACK WndProc(/**/) { m_pFoo* = m_pSingleton->GetFoo(); ... } ClassA::ClassA() { } ClassA* ClassA::GetInstance() { if(!m_pSingleton) { m_pSingleton = new ClassA(); return m_pSingleton; } return NULL; } |
C-/C++-Quelltext |
|
1 |
m_pFoo* = m_pSingleton::GetInstance()->GetFoo(); |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 |
ClassA* ClassA::GetInstance() { if(!m_pSingleton) m_pSingleton = new ClassA(); return m_pSingleton; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 |
ClassA* GetInstance() { if(!m_pSingleton) { m_pSingleton = new ClassA(); return m_pSingleton; } return NULL; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 |
ClassA* GetInstance() { if(!m_pSingleton) { m_pSingleton = new ClassA(); return m_pSingleton; } return m_pSingleton; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 |
ClassA::Init() { m_pFoo = CreateFoo(); } ClassA::Release() { m_pFoo->Release() } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 |
Foo::Release() { if(m_pSingleton) { delete m_pSingleton; m_pSingleton = NULL; } } |
C-/C++-Quelltext |
|
1 |
m_pFoo* = m_pSingleton::GetInstance()->GetFoo(); |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 |
Foo::Release() { if(m_pSingleton) { delete m_pSingleton; m_pSingleton = NULL; } } |
Zitat von »"David_pb"«
Nur um sicher zu gehen, ich meinte diesen Aufruf:
C-/C++-Quelltext
1 m_pFoo* = m_pSingleton::GetInstance()->GetFoo();
Zitat von »"David_pb"«
Zur Freigabe:
C-/C++-Quelltext
1 2 3 4 5 6 7 8 Foo::Release() { if(m_pSingleton) { delete m_pSingleton; m_pSingleton = NULL; } }
Wenn "Foo" den statischen Zeiger kennt. Allerdings musst du darauf achten, dass du die Release Methode vom Singleton auch aufrufst.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
ClassA* cla = CreateInstance(); Foo* foo = cla->GetFoo(); cla->Irgentwas(); // Nachrichtenschleife while(/**/) { foo->irgentwas(); } cla->Release(); |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
ClassA::Release() { // Foo weg... m_pFoo->Release(); // Singleton weg... if(m_pClassA) { delete m_pClassA; m_pClassA = NULL; } } |
C-/C++-Quelltext |
|
1 2 3 4 5 |
if(m_pClassA) { delete m_pClassA; m_pClassA = NULL; } |
C-/C++-Quelltext |
|
1 2 |
delete m_pClassA; m_pClassA = NULL; |
Anonymous
unregistriert
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class uncopyable { uncopyable(uncopyable const&); uncopyable& operator=(uncopyable const&); protected: uncopyable() {} virtual ~uncopyable() {} }; template <class instance_type> class singleton : public uncopyable { protected singleton(); public: inline static instance_type& instance() { static instance_type myInstance; return myInstance; } }; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class a : public singleton<a> { foo* m_foo; protected: foo() : m_foo(new foo(...)) {} ~foo() { delete m_foo; } public: foo const& get_foo() const { return *m_foo; } }; int main() { foo const& foo_instance(a::instance().get_foo()); } |
Werbeanzeige