C++の中でSTL、デザインパターンを勉強中でその一環としてSingletonをテンプレートクラス化して
使ってみる。と言う事をサイト等参考に試作してみたのですが以下のエラーが出ており
調べたりしているのですが解決できず苦慮しており教えて頂きたく思います。
C++
1エラー LNK1120 1 件の未解決の外部参照 DEV_01 C:\MyFile\Sandbox\DEV_01\x64\Debug\DEV_01.exe 1 2エラー LNK2019 未解決の外部シンボル "private: __cdecl SampleObject::SampleObject(void)" (??0SampleObject@@AEAA@XZ) が関数 "public: static class SampleObject * __cdecl Singleton<class SampleObject>::getSingletonPtr(void)" (?getSingletonPtr@?$Singleton@VSampleObject@@@@SAPEAVSampleObject@@XZ) で参照されました。 DEV_01 C:\MyFile\Sandbox\DEV_01\AppSystem.obj 1
【使用環境】
Windows10
VisualStudio2017
DXライブラリ
【サンプルのソースコード】
C++
1<SampleSingleton.h> 2 3template <class _Ty> 4class Singleton 5//class Singleton final // 派生クラスの定義禁止 6{ 7public: 8 typedef _Ty InstanceType; 9 10public: 11/* 12 static void create(){ 13 if (_pInstance == nullptr) { 14 _pInstance = new InstanceType(); 15 } 16 } 17 static void destroy(){ 18 if (_pInstance != nullptr) { 19 delete _pInstance; 20 _pInstance = nullptr; 21 } 22 } 23*/ 24 static InstanceType& getInstanceRef( void ){ 25 return *_pInstance; 26 } 27 static InstanceType* getInstancePtr( void ){ 28 return _pInstance; 29 } 30 static InstanceType* getSingletonPtr( void ){ 31 if ( !_pInstance ) { _pInstance = new InstanceType(); } 32 return _pInstance; 33 } 34 35 // 生成済み? 36 static bool isCreate() { return _pInstance != nullptr; }; 37 // 破棄済み? 38 static bool isDestroy() { return _pInstance == nullptr; }; 39 40private: 41 static InstanceType * _pInstance; //!< 唯一のインスタンス 42 43private: 44 // 禁止 45 Singleton() {} 46 virtual ~Singleton() {} 47 48 Singleton(const Singleton&); /** コピーコンストラクタ(使用禁止) */ 49 Singleton& operator=(const Singleton&); /** 代入演算子(使用禁止) */ 50}; 51 52template <class _Ty> 53typename Singleton<_Ty>::InstanceType* Singleton<_Ty>::_pInstance = nullptr;
C++
1<SampleObject.h> 2 3class SampleObject// : public Singleton<SampleObject > 4{ 5 // SampleObjectのインスタンスを生成する時に、コンストラクタが呼べなかった為friend指定 6 // シングルトンのテンプレート引数に自身を指定したものだけに生成をゆるす 7 friend Singleton<SampleObject>; 8 9public: 10 int m_UseEnable; 11 12private: 13 // コンストラクタ部分をpublicにしてしまうと、SampleObject container; でインスタンスつくれてしまう 14 // 「そのクラスのインスタンスが1つしか生成されないことを保証することができる」 15 // と言うのに反するのでprivateにする必要がある。 16 SampleObject(); // 外部でのインスタンス作成は禁止 17 virtual ~SampleObject(); 18 19}; 20 21inline SampleObject* createObject( void ) 22{ 23 return Singleton<SampleObject>::getSingletonPtr(); 24}
C++
1<main.cpp> 2#include "SampleObject.h" 3#include "DxLib.h" 4 5using CSampleObject= Singleton<SampleObject>; 6 7int WINAPI WinMain( HINSTANCE hInstance, 8 HINSTANCE hPrevInstance, 9 LPSTR lpCmdLine, 10 int nCmdShow ) 11{ 12 // DXライブラリ関係の記述は省略 13 auto result = Singleton<SampleObject>::getSingletonPtr(); 14 15 // DXライブラリ関係の記述は省略 16}
記載してあるコメントで間違っているのがあったり何書いてるのか不明な箇所等
あれば指摘して頂ければ。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/27 08:32
2018/11/27 08:33
2018/11/27 09:06
2018/11/27 09:13
2018/11/27 10:56
2018/11/27 14:55
2018/11/28 07:07
2018/11/28 08:18
2018/11/28 08:42