C++: Undefined reference to instance dans la classe Singleton
Je suis en train d'essayer de mettre en œuvre une usine comme un singleton. J'ai pratiquement utilisé l'exemple de manuel de la pattern Singleton. Voici l' .h fichier:
namespace oxygen{
class ImpFactory{
public:
static boost::shared_ptr<ImpFactory> GetInstance();
private:
static boost::shared_ptr<ImpFactory> mInstance;
};
et de voici le .fichier cpp:
#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;
}
Le code compile, mais j'obtiens une erreur de l'éditeur de liens:
../../lib/oxygène/liboxygen..3.2.4: undefined reference to `oxygène::ImpFactory::mInstance'
Cela a actuellement trois étudiants perplexe. Des idées?
OriginalL'auteur aheld | 2010-01-27
Vous devez vous connecter pour publier un commentaire.
Vous devez définir l'instance statique, pas simplement déclarer. La définition crée l'objet réel auquel vous vous référez.
Dans votre
cpp
fichier, ajoutez la ligne:OriginalL'auteur Eli Bendersky
Vous avez besoin d'une définition pour votre membre statique dans un fichier cpp.
OriginalL'auteur Nikola Smiljanić
Dans votre c++ ajouter ceci:
OriginalL'auteur VDVLeon
sur une autre note de côté, peut-être que vous devriez faire le pointeur d'instance d'un membre statique de la fonction get plutôt qu'à la classe, cela ne fait pas trop de différence lors de l'utilisation de la nouvelle/le pointeur de la méthode. mais si vous étiez à la création d'une instance statique (c'est à dire sans l'aide d'un pointeur, et renvoie une référence à elle d'obtenir une fonction) cela fait une grande différence, parce que:
si ses un membre statique d'une classe, son constructeur est appelé à chaque fois qu' (parce que son mondial) si c'est un membre statique de la fonction get, il n'est pas construit jusqu'à ce qu'il appelle la première fois, cela permet d'éviter certains des problèmes que les gens ont avec les singletons et glorifié globals, l'autre bonne chose est, la plupart des linkers omettra la fonction get et donc l'instance statique entièrement si elle n'est jamais appelée, ainsi, vous n'avez pas à vous inquiéter au sujet de l'appel de nouveau pour qu'il utilise uniquement de la mémoire si elle est utilisée.
OriginalL'auteur matt
Puisque vous êtes à l'aide de Boost, vous pourriez envisager de Stimuler le singleton classes. Découvrez:
Que vous utilisez dépend de ce que vous faites. Alors que je suis un peu anti-singleton pour les raisons habituelles, il est logique de re-utiliser autant que possible. Un mot d'avertissement cependant: le coup de pouce singleton semble avoir déplacé un peu dans les bibliothèques, donc cela peut varier selon la version de Boost que vous utilisez.
OriginalL'auteur Component 10