🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

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

Q&A

解決済

1回答

2912閲覧

エラー「C2504 'Scene_base': 定義されていない基底クラスが宣言されています。」の解決法がわからない

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2021/02/16 05:54

class Game_Scene : public Scene_base

で以下のエラーが発生するのですがなぜこのようなエラーが発生するのでしょうか?全てオーバーライドしていますが原因がわかりません。
void Update() void Draw();関数はオーバーライド定義済です。

「 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー C2504 'Scene_base': 定義されていない基底クラスが宣言されています。 Hack_and_Slash C:\Users\yw325\Desktop\Hack_and_Slash\Hack_and_Slash\Game_Scene.hpp 18

hpp

1#ifndef ___SCENE_BASE_ 2#define ___SCENE_BASE_ 3 4#include "Entry.hpp" 5#include <iostream> 6/*#################################################### 7* シーンの基底クラス 8* 9* 説明 10* 全てのシーンクラスはこのクラスを継承する。 11######################################################*/ 12enum class Scene_Type; 13class Scene_base 14{ 15public: 16 Scene_base(Scene_Type t); //コンストラクタ 17 ~Scene_base(); //デストラクタ 18 19 virtual void Update() = 0; //更新 20 virtual void Draw() = 0; //描画 21 22 Scene_Type getSceneType(); //シーンタイプを取得 23protected: 24 25 Scene_Type Type; //シーンタイプ 26 27}; 28 29 30#endif 31

cpp

1#include "Scene_Base.hpp" 2 3 4//コンストラクタ 5Scene_base::Scene_base(Scene_Type t) 6{ 7 Type = t; //シーンにタイプを設定 8} 9 10//シーンタイプを取得 11Scene_Type Scene_base::getSceneType() 12{ 13 return Type; 14} 15 16//デストラクタ 17Scene_base::~Scene_base() 18{ 19 20}

hpp

1#ifndef ___GAME_SCENE_HPP_ 2#define ___GAME_SCENE_HPP_ 3 4#include "Entry.hpp" 5#include "Scene_base.hpp" 6#include <iostream> 7 8/*#################################################### 9* メインゲーム シーン 10* 11* 説明 12* メインのゲーム画面 13######################################################*/ 14class Scene_base; 15enum class Scene_Type; 16 17class Game_Scene : public Scene_base 18{ 19public: 20 Game_Scene(Scene_Type t); //コンストラクタ 21 ~Game_Scene(); //デストラクタ 22 23 void Update(); //更新 24 void Draw(); //描画 25 26 27private: 28 29 30}; 31 32#endif 33

cpp

1#include "Game_Scene.hpp" 2 3//コンストラクタ 4Game_Scene::Game_Scene(Scene_Type t) : Scene_base(t) 5{ 6 7} 8 9//更新 10void Game_Scene::Update() 11{ 12 printf("ああ"); 13} 14 15//描画 16void Game_Scene::Draw() 17{ 18 printf("ああ"); 19 20} 21 22//デストラクタ 23Game_Scene::~Game_Scene() 24{ 25 26} 27

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

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

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

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

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

int32_t

2021/02/16 09:20 編集

Scene_Base.hpp と Game_Scene.hpp から不要な #include "Entry.hpp" を消すと直りますか? もしそうなら、原因と対策を説明できると思います。 あと、複数のファイルを貼り付けるときはファイル名も書いてください。
guest

回答1

0

ベストアンサー

C++

1class Scene_base; // すでに上で#includeしているので、わざわざ不完全型として再度宣言するのが不適当なのでは? 2enum class Scene_Type; 3 4class Game_Scene : public Scene_base

投稿2021/02/16 06:13

maisumakun

総合スコア145975

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

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

退会済みユーザー

退会済みユーザー

2021/02/16 06:17

質問ですが前方宣言とインクルードはどうやって分ければいいのでしょうか?
maisumakun

2021/02/16 07:34

クラスの前方宣言は、「複数のクラスが循環参照するので1つを先に宣言しないといけない」、あるいは「あるクラスを外部公開したくないので、外部から使うヘッダでは宣言だけにしておく」ような「使わなければならない理由がある」場合以外は不要かと思います。
退会済みユーザー

退会済みユーザー

2021/02/16 07:56

なるほど。インクルードしたのに認識出ない型などと言ったエラーが出る場合前方宣言等で解決すればいいのでしょうか?
maisumakun

2021/02/16 07:59

そのような場当たり的な対応はしないでください。何がエラーの原因か特定して、適切な対応を行ってください。 (きちんとインクルードを行ってなお、クラスの前方宣言がないとコンパイルを通らない例はそうそうありません)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問