003
16.11.2011, 08:09 Uhr
ao
(Operator)
|
Weil das hier:
C++: |
int run(int argc, _TCHAR** pp_argv) { Singleton<int>test(); return 0; }
|
nicht, wie du annimmst, ein Objekt vom Typ Singleton mit Namen test anlegt, sondern eine parameterlose Funktion mit Namen test und Rückgabewert Singleton<int> vereinbart. Es ist ein Prototyp, keine Variablendeklaration.
Du merkst es dann, wenn du in run was mit test machst. Versuch mal, dir test.inst () geben zu lassen.
Das hier:
C++: |
int run(int argc, _TCHAR** pp_argv) { Singleton<int>test; // ohne Klammern! return 0; }
|
versucht, ein Objekt zu erzeugen und fällt auch gleich auf die Nase. So, wie die Klasse Singleton gebaut ist, kann sie nicht direkt instanziert werden. Man kann nur von ihr ableiten.
Gern gemachter Fehler
Und der Destruktor sollte public und virtuell sein, damit man ein von Singleton abgeleitetes Objekt über die Basisklasse zerlegen kann:
C++: |
class Irgendwas : public Singleton { };
int main (void) { Singleton * s = new Irgendwas; // .... delete s; // Hier muss ~Singleton() public sein, sonst Protection-Fehler. // Und er muss virtuell sein, sonst wird an dieser Stelle // nur der Singleton zerlegt, aber nicht das Irgendwas. }
|
Dieser Post wurde am 16.11.2011 um 08:16 Uhr von ao editiert. |