Ah, nun ist das klarer.
Eigentlich ist es Unsinn, zwei Methoden zu haben, um eine Instanz zu bekommen.
Uneigentlich ist das auch Unsinn! Entweder du benutzt immer eine Referenz oder immer einen Zeiger. Mal das eine und dann wieder das andere braucht man nicht.
Sonst hat dein Singleton einen fundamentalen Fehler; man kann ihn kopieren, was gegen das Singleton-Pattern verstößt. Wenn man darauf nicht achtet, funktioniert das hier (so machst du das eben):
|
C-/C++-Quelltext
|
1
|
CMDGEngine NewObj = CMDGEngine::GetEngineRef (); /* Ieeks! Kopie... */
|
Richtig wäre aber folgendes:
|
C-/C++-Quelltext
|
1
2
3
|
CMDGEngine* engine_ptr = CMDGEngine::GetEnginePtr (); /* Zeiger merken */
/* oder */
CMDGEngine& engine_ref = CMDGEngine::GetEngineRef (); /* Referenz merken */
|
Beide Versionen merken sich nur einen Zeiger auf das Engine Objekt und es wird nichts kopiert.
Wenn man unbedingt kopieren will... ach nee. Singletons will man
nicht kopieren! (eine Kopie belegt natürlich wieder soviel neuen Speicher wie das Original, egal was man so kopiert)
Wie verhindert man, dass ein Singleton kopiert werden kann? Ganz einfach:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
|
class Singleton
{
private:
Singleton ();
Singleton (const Singleton&);
Singleton& operator = (const Singleton&);
public:
static Singleton& getInstance ();
};
|
Bis auf den Default-Konstruktor musst du nichtmal was implementieren.
Fazit: Singleton-Pattern nicht verstanden. Setzen, 6. :roll:
[Edit] Zum "nicht kopieren können" siehe auch den Post von Koschka. Hatte den Kommentar überlesen.
Gruss,
Rainer