質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

解決済

Singletonのテンプレートクラス化試作で出る参照エラーが解決出来ない

Iwan
Iwan

総合スコア35

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

2回答

0評価

0クリップ

3403閲覧

投稿2018/11/27 06:27

C++の中でSTL、デザインパターンを勉強中でその一環としてSingletonをテンプレートクラス化して
使ってみる。と言う事をサイト等参考に試作してみたのですが以下のエラーが出ており
調べたりしているのですが解決できず苦慮しており教えて頂きたく思います。

C++

エラー LNK1120 1 件の未解決の外部参照 DEV_01 C:\MyFile\Sandbox\DEV_01\x64\Debug\DEV_01.exe 1 エラー 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++

<SampleSingleton.h> template <class _Ty> class Singleton //class Singleton final // 派生クラスの定義禁止 { public: typedef _Ty InstanceType; public: /* static void create(){ if (_pInstance == nullptr) { _pInstance = new InstanceType(); } } static void destroy(){ if (_pInstance != nullptr) { delete _pInstance; _pInstance = nullptr; } } */ static InstanceType& getInstanceRef( void ){ return *_pInstance; } static InstanceType* getInstancePtr( void ){ return _pInstance; } static InstanceType* getSingletonPtr( void ){ if ( !_pInstance ) { _pInstance = new InstanceType(); } return _pInstance; } // 生成済み? static bool isCreate() { return _pInstance != nullptr; }; // 破棄済み? static bool isDestroy() { return _pInstance == nullptr; }; private: static InstanceType * _pInstance; //!< 唯一のインスタンス private: // 禁止 Singleton() {} virtual ~Singleton() {} Singleton(const Singleton&); /** コピーコンストラクタ(使用禁止) */ Singleton& operator=(const Singleton&); /** 代入演算子(使用禁止) */ }; template <class _Ty> typename Singleton<_Ty>::InstanceType* Singleton<_Ty>::_pInstance = nullptr;

C++

<SampleObject.h> class SampleObject// : public Singleton<SampleObject > { // SampleObjectのインスタンスを生成する時に、コンストラクタが呼べなかった為friend指定 // シングルトンのテンプレート引数に自身を指定したものだけに生成をゆるす friend Singleton<SampleObject>; public: int m_UseEnable; private: // コンストラクタ部分をpublicにしてしまうと、SampleObject container; でインスタンスつくれてしまう // 「そのクラスのインスタンスが1つしか生成されないことを保証することができる」 // と言うのに反するのでprivateにする必要がある。 SampleObject(); // 外部でのインスタンス作成は禁止 virtual ~SampleObject(); }; inline SampleObject* createObject( void ) { return Singleton<SampleObject>::getSingletonPtr(); }

C++

<main.cpp> #include "SampleObject.h" #include "DxLib.h" using CSampleObject= Singleton<SampleObject>; int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {   // DXライブラリ関係の記述は省略 auto result = Singleton<SampleObject>::getSingletonPtr();   // DXライブラリ関係の記述は省略 }

記載してあるコメントで間違っているのがあったり何書いてるのか不明な箇所等
あれば指摘して頂ければ。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

デザインパターン

デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。