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

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

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

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

DXライブラリ

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

Q&A

解決済

2回答

8736閲覧

エラーコード:C2512 クラス、構造体、共用体に既定のコンストラクターがありません が直らない

THETA97556919

総合スコア5

C++

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

DXライブラリ

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

0グッド

0クリップ

投稿2021/06/11 05:05

編集2021/06/11 07:22

前提・実現したいこと

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++初心者です。
いろいろ足りない情報や滅茶苦茶なコードなどあると思われますがよろしくお願いいたします。
必要な情報があれば、追記いたしますのでご連絡ください。

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

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

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

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

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

int32_t

2021/06/11 05:24

コンパイラがエラーを出しているのはどの行ですか? ちなみに、「デフォルトコンストラクタは必ず無いと駄目」というのは、場合によります。
fana

2021/06/11 05:32

Reader型のオブジェクトを生成しているような箇所がどうなっているのか?
THETA97556919

2021/06/11 06:25 編集

修正依頼ありがとうございます。 すぐに追記いたします。 @fanaさん Reader型のオブジェクトを生成しているような箇所 とは、Reader.cppの頭でコンストラクタを呼び出しているところとは違うのでしょうか?
int32_t

2021/06/11 06:34

> エラーが出ているのはxutility(138行目)です。 エラーメッセージにそれ以外のことも書いてありませんか? 質問者さんのコードの中で、このエラーを起こすきっかけになった部分を知りたいのです。
THETA97556919

2021/06/11 06:45

すみません。それ以上は何も書かれていないです。 エラーが起こったきっかけは、Readerコンストラクタを変更した(引数なし→引数ありにした)際ということだけがわかっています。それ以外のきっかけは申し訳ありませんが、わからないです。
int32_t

2021/06/11 06:58 編集

なるほど。 では、fanaさんの書いたように、Readerのオブジェクトを生成しているコードをすべて見つけ出してください。Readerコンストラクタの中身の話ではなくて、Readerコンストラクタを呼んでいるコードです。「Reader r()」とか「new Reader()」とか「Redaer array[10];」とか「std::vector<Reader> reader_list(3)」とか。
THETA97556919

2021/06/11 06:59

了解しました。そちらも追記いたします。
fana

2021/06/11 07:15

> std::shared_ptr<Reader> m_reader; //ここでReaderを生成 えっと,この m_reader に対して m_reader = ... 的な処理を行っている個所があるんですよね? これの右辺側の「...」の部分の大元の出所がどうなっているか? という.
guest

回答2

0

ベストアンサー

m_reader = make_shared<Reader>(); //ここでReaderを生成

ここですね.
これは(※本当は違う部分はあるが,ここではそれをあえて度外視すれば)

m_reader = std::shared_ptr<Reader>( new Reader() );

というような話です.
つまり,new Reader() として,デフォルトコンストラクタを使う形で Reader 型オブジェクトを生成しようとしています.
…んだけども,Reader型にはデフォルトコンストラクタが無い(無い理由は質問文内のリンク先で述べられていますから繰り返しません)ので,
「デフォルトコンストラクタが無いんですが???」とコンパイラが言っているわけです.


さて,
「じゃあ問題解決のためには,デフォルトコンストラクタ Reader::Reader() を用意すればいいのか?」
っていうのは,あなたの作っている物次第です.

というのは,そもそも

Reader(SceneChangedListener* _impl, const Parameter& _parameter);

という,引数ありのコンストラクタは,Reader型のオブジェクトの構築にはこれらの引数が必要だから用意されているのだと考えられるからです.

なので,もしも Reader型オブジェクトの構築にこれらの引数情報が絶対に必要なのであれば,
Reader::Reader() を無理矢理追加してそれを用いてオブジェクトを構築しても,結局「本来あるべき構築手順を経ない,内容がまともでない状態の」オブジェクトになってしまうでしょう.
それではまともに使えないでしょうから結局ダメです.

おそらく,
m_reader = make_shared<Reader>( ここに引数を与える ); //生成時にまともな引数を与える
というのが,わかりやすい修正の方向でしょう.

※もちろん「いやいや,別に構築時に情報を与えなくても良い性質のものなのだよ」という話なのであれば,妥当な Reader::Reader() を追加する,という方向もアリです.

投稿2021/06/11 07:29

編集2021/06/11 07:39
fana

総合スコア11663

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

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

THETA97556919

2021/06/11 08:51

おかげさまで、その箇所に引数を与えることでうまく動きました。 本当にありがとうございました。
guest

0

Reader.h のほうに、
Reader();
を追加するってことなんでは。
そしてcpp の方にも追加

投稿2021/06/11 06:28

y_waiwai

総合スコア87784

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

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

THETA97556919

2021/06/11 07:23

クラス"SceneBase"の規定のコンストラクターは存在しません というエラーが出ました。
y_waiwai

2021/06/11 07:36

ならそっちの方にも追加やね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問