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

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

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

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

Q&A

解決済

4回答

2236閲覧

[C++ 初歩] 認識出来ない型Entry というエラーの解決法と原因が知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2021/05/02 12:56

編集2021/05/02 13:17

提示コードですが。Entry.hでgmae,gameOver,titleの三つをインクルードしてそれをgame,gameOver ,title .hppファイルで使っているため認識できない型 コンパイルエラーが発生してしまうものと思われるのですがこの場合どうやって修正,回避するのでしょうか?

エラー原文 [ 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー C2027 認識できない型 'Entry' が使われています。 Project1 C:\Users\User\Desktop\Project1\Project1\Game.hpp 26
]

cpp

1#ifndef ENTRY_HPP_ 2#define ENTRY_HPP_ 3 4#include "Game.hpp" 5#include "GameOver.hpp" 6#include "Title.hpp" 7 8 9enum class Scene; 10class Entry 11{ 12public: 13 Entry() 14 { 15 changeScene = Scene::Title; 16 title = new Title(); //タイトル 17 game = nullptr; //ゲーム 18 gameOver = nullptr; //ゲームオーバー 19 } 20 21 void Update() 22 { 23 24 if (title != nullptr) 25 { 26 title->Update(this); 27 } 28 else if (game != nullptr) 29 { 30 game->Update(this); 31 } 32 else if (gameOver != nullptr) 33 { 34 gameOver->Update(this); 35 } 36 37 38 39 //シーン推移 40 switch (changeScene) 41 { 42 case Scene::Title: 43 { 44 if (gameOver != nullptr) 45 { 46 delete gameOver; 47 48 } 49 50 if (game != nullptr) 51 { 52 delete game; 53 54 } 55 56 if (title == nullptr) 57 { 58 title = new Title(); 59 } 60 }; 61 break; 62 63 64 case Scene::Game: 65 { 66 if (gameOver != nullptr) 67 { 68 delete gameOver; 69 70 } 71 72 if (game == nullptr) 73 { 74 game = new Game(); 75 76 } 77 78 if (title != nullptr) 79 { 80 delete title; 81 } 82 }; 83 break; 84 85 86 87 88 89 90 case Scene::GameOver: 91 { 92 if (gameOver == nullptr) 93 { 94 gameOver = new GameOver(); 95 96 } 97 98 if (game != nullptr) 99 { 100 delete game; 101 102 } 103 104 if (title != nullptr) 105 { 106 delete title; 107 } 108 }; 109 break; 110 } 111 } 112 113 114 //識別 115 enum class Scene { 116 Title, 117 Game, 118 GameOver 119 }; 120 121 //シーン切り替え 122 void MoveTo(Scene e) 123 { 124 changeScene = e; 125 } 126 127 128 129 130 Scene changeScene; 131 132 private: 133 134 Title* title; 135 Game* game; 136 GameOver* gameOver; 137}; 138 139 140 141 142#endif 143

cpp

1#ifndef GAME_HPP_ 2#define GAME_HPP_ 3 4#include <iostream> 5#include "Entry.hpp" 6class Entry; 7 8//ゲームクラス 9class Game 10{ 11public: 12 Game() 13 { 14 std::cout << "game" << std::endl; 15 } 16 17 void Update(Entry* e) 18 { 19 std::cout<< "game Update()" << std::endl; 20 std::cout<<"scene to: "; 21 int a = 0; 22 std::cin >> a; 23 //getchar(); 24 25 26 e->MoveTo((Entry::Scene)a); 27 } 28 29 void Draw() 30 { 31 std::cout << "gaem Draw()" << std::endl; 32 33 } 34 35}; 36 37#endif;

cpp

1#ifndef GAMEOVER_HPP_ 2#define GAMEOVER_HPP_ 3 4 5 6#include <iostream> 7#include "Entry.hpp" 8 9//gameOverクラス 10class GameOver 11{ 12public: 13 GameOver() 14 { 15 std::cout << "game over" << std::endl; 16 } 17 18 void Update(Entry* e) 19 { 20 std::cout << "game over Update()" << std::endl; 21 std::cout << "move to: "; 22 int a = 0; 23 std::cin >> a; 24 25 26 27 } 28 29 void Draw() 30 { 31 std::cout << "game over Draw()" << std::endl; 32 33 } 34 35}; 36 37#endif

cpp

1#ifndef TITLE_HPP_ 2#define TITLE_HPP_ 3 4 5#include <iostream> 6#include "Entry.hpp" 7 8//タイトルクラス 9class Title 10{ 11public: 12 Title() 13 { 14 std::cout << "title" << std::endl; 15 } 16 17 void Update(Entry* e) 18 { 19 std::cout << "title Update()" << std::endl; 20 getchar(); 21 } 22 23 void Draw() 24 { 25 std::cout << "title Draw()" << std::endl; 26 } 27 28}; 29#endif 30

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

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

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

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

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

episteme

2021/05/02 13:01

相互includeを引き起こしていますが、これは意図したものでしょうか?
episteme

2021/05/02 13:05 編集

> 認識できない型 リンクエラーが発生してしまうものと思われる エラー・メッセージを「そのまま」呈示してください。 ※ 型が認識できないとすれば、それはリンクエラーではなさそうですし
退会済みユーザー

退会済みユーザー

2021/05/02 13:06

はい。シーン推移をするので仕方ないのです。
episteme

2021/05/02 13:09

仕方ない? なんで?
episteme

2021/05/02 13:14

> エラー C2027 認識できない型 'Entry' が使われています。 リンクエラーではありません。
退会済みユーザー

退会済みユーザー

2021/05/02 13:19

編集しました。
退会済みユーザー

退会済みユーザー

2021/05/02 13:23

これはヘッダーに実装しているのでしょうか
退会済みユーザー

退会済みユーザー

2021/05/02 13:23

とりえずシーン推移を実験したいのでヘッダーにしました。本番ではソースとヘッダー分けます。
guest

回答4

0

ベストアンサー

「二重インクルードを回避しているのにも関わらず定義されない理由が知りたい。」
https://teratail.com/questions/323501#reply-448756

こちらの質問が全く同じ問題なので、回答が参考になると思います。

投稿2021/05/02 16:22

int32_t

総合スコア20659

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

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

0

...やりたいことはこんな↓ことなんかな(推測だけど)

C++

1// ----- Scene.hpp ----- 2#ifndef SCENE_HPP_ 3#define SCENE_HPP_ 4 5class Entry; 6 7class Scene { 8public: 9 virtual void Update(Entry* e) =0; 10 virtual void Draw() =0; 11}; 12#endif 13 14// ----- Game.hpp ----- 15#ifndef GAME_HPP_ 16#define GAME_HPP_ 17 18#include <iostream> 19#include "Scene.hpp" 20 21//ゲームクラス 22class Game : public Scene { 23public: 24 Game() { 25 std::cout << "game" << std::endl; 26 } 27 28 void Update(Entry* e) override { 29 std::cout << "game Update()" << std::endl; 30 std::cout << "scene to: "; 31 getchar(); 32 } 33 34 void Draw() override { 35 std::cout << "game Draw()" << std::endl; 36 } 37 38}; 39#endif 40 41// ----- GameOver.hpp ----- 42#ifndef GAMEOVER_HPP_ 43#define GAMEOVER_HPP_ 44 45#include <iostream> 46#include "Scene.hpp" 47 48//gameOverクラス 49class GameOver : public Scene { 50public: 51 GameOver() { 52 std::cout << "game over" << std::endl; 53 } 54 55 void Update(Entry* e) override { 56 std::cout << "game over Update()" << std::endl; 57 std::cout << "move to: "; 58 getchar(); 59 } 60 61 void Draw() override { 62 std::cout << "game over Draw()" << std::endl; 63 } 64 65}; 66#endif 67 68// ----- Title.hpp ----- 69#ifndef TITLE_HPP_ 70#define TITLE_HPP_ 71 72#include <iostream> 73#include "Scene.hpp" 74 75//タイトルクラス 76class Title : public Scene { 77public: 78 Title() { 79 std::cout << "title" << std::endl; 80 } 81 82 void Update(Entry* e) override { 83 std::cout << "title Update()" << std::endl; 84 getchar(); 85 } 86 87 void Draw() { 88 std::cout << "title Draw()" << std::endl; 89 } 90 91}; 92#endif 93 94// ----- Entry.hpp ----- 95#ifndef ENTRY_HPP_ 96#define ENTRY_HPP_ 97 98#include <memory> 99#include "Title.hpp" 100 101class Entry { 102public: 103 Entry() { 104 scene_ = std::make_unique<Title>(); 105 } 106 107 void Update() { 108 scene_->Update(this); 109 } 110 111 //シーン切り替え 112 void MoveTo(std::unique_ptr<Scene> e) { 113 scene_ = std::move(e); 114 } 115 116private: 117 118 std::unique_ptr<Scene> scene_; 119}; 120#endif 121 122// ----- foo.cpp (かるくおためし) ----- 123#include "Entry.hpp" 124 125int main() { 126 Entry ent; 127 ent.Update(); 128} 129

投稿2021/05/03 00:11

episteme

総合スコア16614

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

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

0

回避だけなら各シーンのヘッダからEntry.hのインクルードを削除して、class Entryを前方宣言すればできます。ただそれでは実験とは言え、すぐやれる事が行き詰まるので、最初からヘッダとソースに分ける事をお勧めします。

あとインナークラスの前方参照は出来ないので、enum class Scene;は意図と違うものを参照してしまっていると思われます。

投稿2021/05/02 19:24

Serbonis

総合スコア581

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

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

退会済みユーザー

退会済みユーザー

2021/05/03 00:22

質問ですが > 各シーンのヘッダからEntry.hのインクルードを削除して、class Entryを前方宣言 したのですがエラーになります。
Serbonis

2021/05/03 01:58

game.hppのUpdateにEntryを使用している箇所がありました。 e->MoveTo((Entry::Scene)a); をコメントアウトしてみてください。これをコメントアウトしてしまっては実験が進まないと思いますが、これが「すぐやれる事が行き詰まる」に相当する部分です。
退会済みユーザー

退会済みユーザー

2021/05/03 02:57

ヘッダーとソースを実験だろうが分割しました。
guest

0

※ 回答ではありません

Game.hppで "Entry.hpp" のinclude直後に
class Entry; しているのは何故ですか? 必要ですか?

投稿2021/05/02 13:23

episteme

総合スコア16614

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

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

退会済みユーザー

退会済みユーザー

2021/05/02 13:25

前方宣言したら動くかなって思ったので
episteme

2021/05/02 13:28 編集

で、動きましたか? 必要でしたか? やみくもにいじくりまわして「動けばOK」なんですか?
退会済みユーザー

退会済みユーザー

2021/05/02 13:28

すいませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問