C++: Undefined reference to instance in Singleton-Klasse
Ich bin derzeit versuchen zu implementieren, eine Fabrik als singleton. Ich habe praktisch das lehrbuch-Beispiel des Singleton-Musters. Hier ist die .h-Datei:
namespace oxygen{
class ImpFactory{
public:
static boost::shared_ptr<ImpFactory> GetInstance();
private:
static boost::shared_ptr<ImpFactory> mInstance;
};
und hier ist die .cpp-Datei:
#include "impfactory.h"
using namespace oxygen;
using namespace boost;
shared_ptr<ImpFactory> ImpFactory::GetInstance(){
if (mInstance.get() == 0)
mInstance = shared_ptr<ImpFactory>(new ImpFactory());
return mInstance;
}
Den code kompiliert, aber ich bekomme einen linker Fehler:
../../lib/Sauerstoff/liboxygen.so.3.2.4: undefined reference to `Sauerstoff::ImpFactory::mInstance'
Dieser hat derzeit drei Schüler ratlos. Irgendwelche Ideen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie definieren die statische Instanz, die nicht nur deklarieren. Die definition wird das eigentliche Objekt Sie sich beziehen.
In Ihrem
cpp
- Datei, fügen Sie die Zeile:Brauchen Sie eine definition für Ihre statischen member in einer cpp-Datei.
In der c++ - fügen Sie diese:
auf einer anderen Anmerkung, vielleicht sollten Sie den Instanz-Zeiger ein statisches Mitglied der get-Funktion anstatt der Klasse, das nicht machen zu viel Unterschied bei der Verwendung der neuen Laserpointer-Methode, die Sie sind. aber wenn Sie einfach erstellen Sie eine statische Instanz (dh nicht mit einem Zeiger, und die Rückgabe einer Referenz auf sich von den get-get-Funktion) dies macht einen großen Unterschied, denn:
wenn Ihr eine statische member einer Klasse, deren Konstruktor aufgerufen wird, wenn Sie (weil global), wenn Ihr ein statisches Mitglied der get-Funktion, es ist nicht konstruiert, bis es heißt das erste mal, das lindert einige der Probleme, die Menschen haben mit singletons und Sie verherrlicht globals, die andere gute Sache ist, die meisten Linker weglassen der get-Funktion und damit die statische Instanz völlig, wenn es nie genannt wird, damit Sie nicht haben, um sorgen über den Aufruf neu, so dass es verwendet nur Speicher, wenn Sie verwendet wird.
Da bist du mit Boost, möchten Sie vielleicht zu prüfen, die Boost-singleton-Klassen. Check-out:
Welche Sie verwenden, hängt davon ab, was du tust. Ich bin zwar ein bisschen anti-singleton für die üblichen Gründe, die es sinnvoll wieder zu verwenden, wo es möglich ist. Ein Wort der Warnung jedoch: die Boost-singleton zu haben scheint, bewegt ein bisschen in den Bibliotheken kann dies variieren, je nachdem, welche version von Boost, die Sie verwenden.