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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C++

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

DXライブラリ

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

Q&A

解決済

3回答

3389閲覧

C++ シングルトンモデルでVectorを生成して保持する方法が知りたい

kituneame080

総合スコア10

C++

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

DXライブラリ

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

0グッド

0クリップ

投稿2019/03/03 09:45

編集2019/03/03 10:33

前提・実現したいこと

C++とDxライブラリを使ってゲームを作っています。
ゲームのセーブデータを管理するクラスをゲーム開始からゲーム終了まで保持したく
セーブデータのクラスをシングルトンモデルで確保しています。

そのモデル内で、ゲームの31個のセーブデータをVectorコンテナで管理をしたいです。

しかし、組み方と知識不足から
vectorを初期化できず、大方LINK2001のリンカーエラーで実装できずにいます。

発生している問題・エラーメッセージ

シングルトンモデルの静的なクラス内で静的なvectorコンテナが作れない

該当のソースコード

hpp

1//データベースの情報用 2class SaveLoadDto { 3private: 4 int FILE_NUMBER; 5 int YEAR, MON, DAY; 6 std::string STORY_TITLE; 7 8public: 9 SaveLoadDto(); 10 SaveLoadDto(std::string Story_Title); 11}; 12class SaveLoad 13{ 14private: 15 static SaveLoad *STATIC_SAVELOAD; 16 static std::vector<SaveLoadDto> SAVELOADDATA; 17 18 SaveLoad(); 19 ~SaveLoad(); 20 void Initialize(); 21 22public: 23 static SaveLoad *GetInstance(); 24 static void Create(); 25 static void Destroy(); 26 static void UpDate(); 27 static void View(); 28};

cpp

1SaveLoad * SaveLoad::STATIC_SAVELOAD = NULL; 2static std::vector<SaveLoadDto*> SAVELOADDATA(31); 3 4SaveLoad::SaveLoad() 5{ 6 7} 8 9SaveLoad::~SaveLoad() 10{ 11} 12 13///変数を初期化します 14void SaveLoad::Initialize() 15{ 16  STATIC_SAVELOAD-> 17 STATIC_SAVELOAD->SAVELOADDATA //ここでどう VECTORを初期化すればいいのか 18} 19

試したこと

一度他の物を生成して代入する

///変数を初期化します void SaveLoad::Initialize() {   std::vector<SaveLoadDto> INI STATIC_SAVELOAD->SAVELOADDATA.swap(INI) //LNK2001 リンカーエラー }

コピーコンストラクタを生成する:本体をすでに持っているといわれる

グローバルで宣言して、その変数をポインターで保持する: LNK2001 リンカーエラー
これに関しては「static std::vectorSaveLoad::SaveLoadDto *SAVELOADDATA_P;」という記述がいけないか?

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

まず、問題となっているのはepistemeさんも指摘している。

SaveLoad * SaveLoad::STATIC_SAVELOAD = NULL;
static std::vector<SaveLoadDto*> SAVELOADDATA(31);

この2行目の定義部分です。

これでは、単にSAVELOADDATAというstaticなグローバル変数を定義しているだけです。

std::vector<SaveLoadDto*> SAVELOAD::SAVELOADDATA(31)
とする必要があります。


次に、考える必要があるのが「なぜ、シングルトンクラスにstaticメンバ変数が必要なのか?」です。
クラスの実体が1つしかないのならば、普通のメンバ変数でも違いはほぼないはずです。

(一番大きな違いは、
STATIC_SAVELOAD->SAVELOADDATAの代わりにSAVELOAD::SAVELOADDATA
SaveLoadクラス内からはSAVELOADDATAでアクセスできる事でしょう。)

投稿2019/03/03 15:27

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

メンバー宣言時の'static'が不必要でした。

外したら、普通にvectorのメソッドが使用可能になり、値が保持されるようになりました。

お騒がせ致しました

hpp

1class SaveLoad 2{ 3private: 4 std::vector<SaveLoadDto> SAVE_LOAD_DATA; 5

投稿2019/03/03 14:56

kituneame080

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

リンクエラーて、なにが足りないっていうてます?

static std::vector<SaveLoadDto*> SAVELOADDATA(31);

static std::vector<SaveLoadDto*> **SaveLoad::**SAVELOADDATA(31); じゃなくて?

投稿2019/03/03 11:01

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kituneame080

2019/03/03 11:20

回答ありがとうございます LNK2001 外部シンボル ""private: static class std::vector<class SaveLoadDto,class std::allocator<class SaveLoadDto> > SaveLoad::SAVELOADDATA" (?SAVELOADDATA@SaveLoad@@0V?$vector@VSaveLoadDto@@V?$allocator@VSaveLoadDto@@@std@@@std@@A)" は未解決です。 がエラーメッセージです おそらく初期化ができていないのが、原因だと思われるのですが、 「STATIC_SAVELOAD->SAVELOADDATA(text);」 と記述してもpointer-to-fanction型に対する適切なoperator()または変換関数のないクラス型のオブジェクトの呼び出しです と怒られてしまいます。 また、ご指摘いただいた記述を行うと「メンバー宣言では修飾名は使用できません」と言われてしまいます。
episteme

2019/03/03 11:30

ごめん、アタマの'static'は不要。
kituneame080

2019/03/03 11:33

'static'を外しても同様のメッセージで怒られてしまいますね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問