Direkte Anfänger Probleme:) Singleton => error LNK2001
-
Hallo Leute,
ich bekomm einen LNK2001 fehler bei einer einfachen Singelton klasse:(
Header:
#pragma once class Tim3 { private: Tim3(void); ~Tim3(void); static Tim3* _pInstance; public: static Tim3* Singelton(void); };code:
#include "Tim3.h" Tim3::Tim3(void) { } Tim3* Tim3::Singelton(void) { if(Tim3::_pInstance == NULL) Tim3::_pInstance = new Tim3(); return Tim3::_pInstance; return NULL; } Tim3::~Tim3(void) { }Was fehltmhier denn?

Danke und Grüße
-
Die Deklaration der static-Variablen in der CPP-Datei.
PS: Singelton -> Singleton
Und laß das (void) weg, es reicht in C++ ().
-
Eine Definition der statischen Variable _pInstance:
Tim3* Tim3::_pInstance;muss noch in die .cpp mit rein.
Erklärung:
In der Klassendeklaration wird die statische Variable nur deklariert, sie wird aber noch nicht definiert, insbesondere wird da noch kein Speicher für die Variable bereitgestellt. Das wäre ja auch komisch, weil der Head ggf. ganz oft inkludiert werden kann, und woher soll der Compiler dann wissen wann er Speicher anlegen muss und wann nicht. Das macht man dann in der zugehörigen Übersetzungseinheit (ÜE). Da jede ÜE genau einmal übersetzt wird, reserviert der Compiler so genau einmal Speicher für die statische Variable.
-
hmm ok super danke funktioniert:)
oh man der umstieg von c# wieder ac++ nach 5 jahren.. schleppend:p
p.s. das Void hat mir VS automatisch miteingefügt...
-
In der .cpp fehlt:
Tim3* Tim3::_pInstance = NULL;Wenn du schon Singletons verwenden musst, mach es lieber so:
// Header class Tim3 { ... public: static Tim3 &Singleton(); ... }; // .cpp Tim3 &Tim3::Singleton() { static Tim3 myTim3; return myTim3; }Edit: Singleton() gehört natürlich public.
-
@Jester : Perfekt danke für die erklärung, leutet ein:)
ich habe die variable in der c++ so deklariert
static Tim3* _pInstance;und in der header rausgenommen!
Aber das müsste doch jetzt auch mit dem schlüsselwort extern gehn?
So dass "static Tim3* _pInstance;" in der header ist, und in der cpp " extern Tim3* _pInstance;"? aber hat nich geklappt:)Grüße
-
// .cpp
Tim3 &Tim3::Singleton()
{
static Tim3 myTim3;
return myTim3;
}coole idee, aber da muss der ctor öffentlich sein, was ich eig. nich will:)
-
NullBockException schrieb:
// .cpp
Tim3 &Tim3::Singleton()
{
static Tim3 myTim3;
return myTim3;
}coole idee, aber da muss der ctor öffentlich sein, was ich eig. nich will:)
Nö muss er nicht, das sollte genau so gehen wie ich es gepostet habe.
Bei mir unter clang kompilierts zumindest.In deinem originalen Code rufst du ja auch den privaten Konstruktor der Klasse auf.
NullBockException schrieb:
Tim3::_pInstance = new Tim3();
-
sorry mein fehler, irgendwie hatte VS an der stelle
static Tim3 myTim3;gemotzt, jetzt gehts:) Danke holzkübel;)
-
NullBockException schrieb:
irgendwie hatte VS an der stelle gemotzt, jetzt gehts:) Danke holzkübel;)
Null Problemo, gern geschehen!
-
Leute, die Singletons schreiben, lassen vermutlich auch ihren Hund auf den Gehweg kacken. Machen ja andere wieder weg.
-
Thug Life :p
-
@NullBockException
Standardfragen wenn jmd. Singletons verwendet: Wieso verwendest du ein Singleton? Welches Problem meinst du damit zu lösen?