以下の提示コードですが以下の提示画像のエラーが発生するのですがなぜでしょうか?全てのヘッダーファイルにインクルードガードを行い
二重インクルードがあるかどうか調べましたがどうしてもわかりません。これはなぜでしょうか?
下記のソース・ファイルは何もインクルードしてません。またライブラリファイルです。
hpp
1#include "glm/glm.hpp" 2#include "dxlib.h" 3 4#include "Input.hpp" 5#include "Collision.hpp"
hpp
1#ifndef ___MAPCHIP_HPP_ 2#define ___MAPCHIP_HPP_ 3 4#include "glm/glm.hpp" 5#include "dxlib.h" 6 7#include "Actor.hpp" 8#include "Collision.hpp" 9 10/*#################################################### 11* マップチップクラス 12* 13* 説明 14* ステージのマップチップの情報 15######################################################*/ 16 17//ステージのオブジェクトの種別 18enum class StageObjectType 19{ 20 None, 21 22 23 Enemy, 24 Player, 25 Item, 26 27 Block, 28 Brick, 29 30 Shop, 31 32}; 33 34class MapChip : public Actor 35{ 36public: 37 MapChip(StageObjectType t,glm::ivec2 pos,glm::ivec2 size,int handle); //コンストラクタ 38 ~MapChip(); //デストラクタ 39 40 void Update(); //計算 41 void Draw(); //描画 42 43 44 45 Box_Collision mCol; 46private: 47 int mSprite; //スプライト 48 49}; 50 51 52#endif 53
hpp
1#ifndef ___BULLET_HPP_ 2#define ___BULLET_HPP_ 3 4#include "DxLib.h" 5#include "glm/glm.hpp" 6#include "Actor.hpp" 7//#include "Entry.hpp" 8 9 10/*#################################################### 11* バレット(弾) 12* 13* 説明 14* vectorで管理 15* プレイヤーの攻撃 16* 17######################################################*/ 18 19class Bullet : public Actor 20{ 21public: 22 Bullet(glm::ivec2 pos, glm::ivec2 vec, int handle); //コンストラクタ 23 ~Bullet(); //デストラクタ 24 25 void Update(); //更新 26 void Draw(); //描画 27 28private: 29 int mSprite; //スプライト 30 int mSpeed; //バレットの速度 31}; 32 33 34#endif 35
cpp
1#ifndef ___PLAYER_HPP_ 2#define ___PLAYER_HPP_ 3 4 5#include <iostream> 6#include <vector> 7 8//#include "Actor.hpp" 9//#include "Entry.hpp" 10 11#include "Input.hpp" 12#include "Bullet.hpp" 13#include "Collision.hpp" 14 15#define SPEED 10 16 17/*#################################################### 18* プレイヤークラス 19######################################################*/ 20 21//前方宣言 22class Bullet; 23 24class Player : public Actor 25{ 26public: 27 Player(Entry* e); //コンストラクタ 28 ~Player(); //デストラクタ 29 30 31 void Update(); //更新 32 void Draw(); //描画 33 34 // バレット 35 void Bullet_Update(); //更新 36 void Bullet_Draw(); //描画 37 38 //プレイヤー 39 void Player_Update(); //更新 40 void Player_Draw(); //描画 41 42 43 bool getIsMenu(); //ショップ画面を開いているかどうか? 44 void setIsMenu(bool b); // メニューを開くかどうか設定 45 void FixPos(glm::ivec2 pos); //当たり判定で座標を修正 46 47 48 Box_Collision mCol; //当たり判定 49private: 50 51 int mSprite; //プレイヤー スプライト 52 int mBullet_Sprite; //バレット スプライト 53 54 int mSpeed; //速度 55 56 std::shared_ptr<Input> mInput; //キー入力 57 std::vector<Bullet> mBullet; //バレット 58 59 bool mMenu; //ショップ画面を開くかどうか? 60 61 62 63}; 64 65 66#endif 67
hpp
1#ifndef ___ACTOR_HPP_ 2#define ___ACTOR_HPP_ 3 4#include "glm/glm.hpp" 5#include "dxlib.h" 6 7#include "Entry.hpp" 8/*#################################################### 9* アクター 10* 11* 説明 12* 全てのゲームオブジェクトはこれを継承する。 13######################################################*/ 14 15class Actor 16{ 17public: 18 Actor(Entry* e,glm::ivec2 pos = glm::ivec2(0, 0), glm::ivec2 vec = glm::ivec2(0, 0)); //コンストラクタ 19 ~Actor(); //デストラクタ 20 21 void virtual Update() = 0; //計算 22 void virtual Draw() = 0; //描画 23 24 //取得関係 25 glm::ivec2 getVector(); //方向 26 glm::ivec2 getPosition(); //座標 27protected: 28 29 glm::ivec2 mPosition; //座標 30 glm::ivec2 mVector; //方向 31 glm::ivec2 mSize; //スプライトのサイズ 32 33 Entry* Owner; //Entry クラス 34 35}; 36 37 38#endif 39
https://teratail.com/questions/320244 と https://teratail.com/questions/322839 と同じ問題のように見えます。原因を理解しないままなので、何度でも同じ問題にぶつかりますね。
Actor.hpp の「#include "Entry.hpp"」を削除して「class Entry;」を足すと問題は解消しますか? もしそうなら、回答を書きます。
いえ、治りません、#include "Entry.hpp"部にある#define ありませんと表示されます。
それは必要なファイルに「#include "Entry.hpp"」を足せばよいです。
「#include "Actor.hpp"しているのに class Actor がないと言われる」という問題が解消するかどうかを知りたいです。
治りましたが何が原因なのでしょうか?今だにちょっとわかりません。
質問内容とは関係ないですが,
___ACTOR_HPP_
みたいな名前は予約されているので使っちゃダメ,というルールあります.
(「C C++ アンダーバー 予約」とかなんとか検索すればそういう話を見つけられるかと.)
回答2件
あなたの回答
tips
プレビュー