前提・実現したいこと
SceneBaseクラスの機能を持つ、Readerクラスを派生クラスとして作りたい。
→インスタンスの作成時エラー発生
発生している問題・エラーメッセージ
C2512 Reader::Readerクラス、構造体、共用体に既定のコンストラクターがありません 追記:エラーが出ているのはxutility(138行目)です。 //FUNCTION TEMPLATE _Construct_in_place template<class _Ty, class... _Types> void _Construct_in_place(_Ty& Obj, _Types&&... _Args)noexcept(is_nothrow_constructible_v<_Ty, _Types...>{ ::new(_Voidify_iter(_STD addressof(Obj))) _Ty(_STD forward<_Types>(_Args)...); //この行_Tyで「指定された引数によるテンプレートのインスタンス化でエラーが発生しました」と警告が出ている }
該当のソースコード
Reader.h
C++
1#pragma once 2#include "Task.h" 3#include "Define.h" 4#include "SceneBase.h" 5#include <queue> 6#include <any> 7 8 9class Reader : public SceneBace 10{ 11private: 12 /*Readerのメンバ変数など(今回のエラーとは無関係)*/ 13 14public: 15 std::queue<std::any> methodQ; 16 17 Reader(SceneChangedListener* _impl, const Parameter& _parameter); //問題のコンストラクタ 18 ~Reader() = default; 19 20//以下、その他メンバ変数・メンバ関数 今回のエラーとは関係がないと思われる 21 void update() override; 22 void draw() const override; 23 24 void Read(); 25 26 void ReadButton(int _x, int _y, int _sizeX, int _sizeY, const char* _str); 27 void OnClick(); 28 29 30 static bool isWhileMethodOn; //ずっと をつかっているか 31 static bool isIfMethodOn; //もし~なら をつかっているか 32 static bool isRedDraw; 33 static bool isCommon; //普通の処理かどうか 通常処理なら1秒実行 ifかwhileなら1フレーム実行 34 static bool ptrRead; 35 36};
Reader.cpp
C++
1#include "Reader.h" 2#include "GameScene.h" 3#include "Method.h" 4#include <iostream> 5#include <DxLib.h> 6 7/*staticメンバ変数の実体 省略*/ 8 9Reader::Reader(SceneChangedListener* _impl, const Parameter& _parameter) : SceneBace(_impl, _parameter) 10{ 11 12} 13 14/*以下略*/
SceneBase.h
C++
1#pragma once 2 3#include "SceneChangedListener.h" 4#include "Parameter.h" 5 6class SceneChangedListener; 7 8class SceneBace 9{ 10protected: 11 SceneChangedListener* m_SceneChanged; 12 13public: 14 SceneBace(SceneChangedListener* _impl, const Parameter& parameter); 15 virtual ~SceneBace() = default; 16 virtual void update() = 0; 17 virtual void draw() const = 0; 18};
SceneBase.cpp
C++
1#include "SceneBase.h" 2 3SceneBace::SceneBace(SceneChangedListener* _impl, const Parameter& parameter) : m_SceneChanged(_impl) 4{ 5}
SceneChangedListener.h
C++
1#pragma once 2//リスナーのインターフェイス 3 4#include "enumScene.h" 5#include "SceneBase.h" 6#include "Parameter.h" 7 8class SceneChangedListener 9{ 10public: 11 SceneChangedListener() = default; 12 virtual ~SceneChangedListener() = default; 13 virtual void SceneChanged(const enumScene _scene, const Parameter& _parameter, const bool stackClear) = 0; 14 virtual void SceneBack() = 0; 15};
以下追記:
Reader()を生成している箇所について
GameScene.cpp(26)
GameScene.h
C++
1#pragma once 2 3#include <memory> 4#include "SceneBase.h" 5#include "MethodBox.h" 6#include "Reader.h" 7#include "Field.h" 8#include "Task.h" 9 10class GameScene : public SceneBace 11{ 12private: 13 int m_level; 14 std::shared_ptr<Field> m_field; 15 std::shared_ptr<Reader> m_reader; 16 17public: 18 const static char* ParameterTagStage; 19 20 GameScene(SceneChangedListener* _impl, const Parameter& _parameter); 21 virtual ~GameScene() = default; 22 23 void update() override; 24 void draw() const override; 25 26 static std::shared_ptr<MethodBox> m_methodBoxRed; 27 static std::shared_ptr<MethodBox> m_methodBoxBlue; 28 static std::shared_ptr<MethodBox> m_methodBoxIf; 29 static std::shared_ptr<MethodBox> m_methodBoxWhile; 30 static std::shared_ptr<MethodBox> m_dummy; 31};
GameScene.cpp
C++
1#include "GameScene.h" 2#include <DxLib.h> 3 4using namespace std; 5 6const char* GameScene::ParameterTagStage = "ParameterTagStage"; 7 8std::shared_ptr<MethodBox> GameScene::m_methodBoxRed; //staticメンバの実体 9std::shared_ptr<MethodBox> GameScene::m_methodBoxBlue; 10std::shared_ptr<MethodBox> GameScene::m_methodBoxIf; 11std::shared_ptr<MethodBox> GameScene::m_methodBoxWhile; 12std::shared_ptr<MethodBox> GameScene::m_dummy; 13 14//このシーンで使用するオブジェクトの生成 15GameScene::GameScene(SceneChangedListener* _impl, const Parameter& _parameter) : SceneBace(_impl, _parameter) 16{ 17 m_level = _parameter.get(ParameterTagStage); 18 19 switch (m_level) 20 { 21 case Define::enumStage::Demo: 22 m_methodBoxRed = make_shared<MethodBox>(200, 200, 160, 50, "赤い丸を表示", &Method::RedCircle); 23 m_methodBoxBlue = make_shared<MethodBox>(500, 200, 160, 50, "青い丸を表示", &Method::BlueCircle); 24 m_methodBoxIf = make_shared<MethodBox>(100, 100, 280, 50, "赤丸が表示されているなら", &Method::SwitchIfState); 25 m_methodBoxWhile = make_shared<MethodBox>(500, 100, 100, 50, "ずっと", &Method::ContinueState); 26 m_reader = make_shared<Reader>(); //ここでReaderを生成 27 break; 28 29 case Define::enumStage::Tutorial: 30 break; 31 32 default: 33 break; 34 } 35 36 m_field = make_shared<Field>(); 37 m_dummy = make_shared<MethodBox>(1, 1, 0, 0, "", &Method::Dummy); 38 39} 40 41//現在のシーンのフレーム処理 42void GameScene::update() 43{ 44 switch (m_level) 45 { 46 case Define::enumStage::Demo: 47 m_methodBoxRed->update(); 48 m_methodBoxBlue->update(); 49 m_methodBoxIf->update(); 50 m_methodBoxWhile->update(); 51 m_reader->update(); 52 break; 53 54 case Define::enumStage::Tutorial: 55 break; 56 57 case Define::enumStage::Exe: 58 m_reader->update(); 59 break; 60 61 default: 62 break; 63 } 64 65 m_field->update(); 66 m_dummy->update(); 67 68 if (CheckHitKey(KEY_INPUT_ESCAPE)) 69 { 70 m_SceneChanged->SceneBack(); 71 } 72} 73 74//現在のシーンの描画処理 75void GameScene::draw() const 76{ 77 switch (m_level) 78 { 79 case Define::enumStage::Demo: 80 81 m_methodBoxRed->draw(); 82 m_methodBoxBlue->draw(); 83 m_methodBoxIf->draw(); 84 m_methodBoxWhile->draw(); 85 m_reader->draw(); 86 m_reader->ReadButton(Define::ReadButton_X1, Define::ReadButton_Y1, 75, 75, "実行"); 87 break; 88 89 case Define::enumStage::Tutorial: 90 DrawString(100, 100, "準備中", GetColor(255, 255, 255)); 91 break; 92 93 case Define::enumStage::Exe: 94 break; 95 96 97 default: 98 break; 99 } 100 101 m_field->draw(); 102 m_dummy->draw(); 103 104 105}
試したこと
このリンクにかかれてある、
デフォルトコンストラクタは必ず無いと駄目ですので、引数有りのコンストラクタだけを書くとエラーになります。
という情報を頼りに、新しく引数なしのデフォルトコンストラクタを追記した。
→**'Reader::Reader(void)':削除された関数を参照しようとしています**という新しいエラー発生。
このSceneBaseの継承の仕方は、ほかのクラスではうまく動いている。
TitleScene.h
C++
1#pragma once 2#include "SceneBase.h" 3 4class TitleScene : public SceneBace 5{ 6public: 7 TitleScene(SceneChangedListener* _impl, const Parameter& _parameter); 8 virtual ~TitleScene() = default; 9 void update() override; 10 void draw() const override; 11};
TitleScene.cpp
C++
1#include "TitleScene.h" 2#include <DxLib.h> 3#include "GameScene.h" 4#include "Define.h" 5 6TitleScene::TitleScene(SceneChangedListener* _impl, const Parameter& _parameter) : SceneBace(_impl, _parameter) 7{ 8} 9 10void TitleScene::update() 11{ 12 if (CheckHitKey(KEY_INPUT_0)) 13 { 14 Parameter parameter; 15 parameter.set(GameScene::ParameterTagStage, Define::enumStage::Demo); 16 const bool stackClear = false; 17 m_SceneChanged->SceneChanged(enumScene::Game, parameter, stackClear); 18 } 19 20 if (CheckHitKey(KEY_INPUT_1)) 21 { 22 Parameter parameter; 23 parameter.set(GameScene::ParameterTagStage, Define::enumStage::Tutorial); 24 const bool stackClear = false; 25 m_SceneChanged->SceneChanged(enumScene::Game, parameter, stackClear); 26 } 27} 28 29void TitleScene::draw() const 30{ 31 DrawString(100, 100, "タイトル画面", GetColor(255, 255, 255)); 32}
TitleSceneのほうは今まで特に何もエラーを吐かれたことはない。
今日Readerに同じ処理を追加しようとしたところエラーを吐かれた。
補足情報(FW/ツールのバージョンなど)
C++初心者です。
いろいろ足りない情報や滅茶苦茶なコードなどあると思われますがよろしくお願いいたします。
必要な情報があれば、追記いたしますのでご連絡ください。
回答2件
あなたの回答
tips
プレビュー