以下の提示コードですが以下の提示画像のエラーが発生するのですがなぜでしょうか?全てのヘッダーファイルにインクルードガードを行い
二重インクルードがあるかどうか調べましたがどうしてもわかりません。これはなぜでしょうか?
下記のソース・ファイルは何もインクルードしてません。またライブラリファイルです。
hpp
#include "glm/glm.hpp" #include "dxlib.h" #include "Input.hpp" #include "Collision.hpp"
hpp
#ifndef ___MAPCHIP_HPP_ #define ___MAPCHIP_HPP_ #include "glm/glm.hpp" #include "dxlib.h" #include "Actor.hpp" #include "Collision.hpp" /*#################################################### * マップチップクラス * * 説明 * ステージのマップチップの情報 ######################################################*/ //ステージのオブジェクトの種別 enum class StageObjectType { None, Enemy, Player, Item, Block, Brick, Shop, }; class MapChip : public Actor { public: MapChip(StageObjectType t,glm::ivec2 pos,glm::ivec2 size,int handle); //コンストラクタ ~MapChip(); //デストラクタ void Update(); //計算 void Draw(); //描画 Box_Collision mCol; private: int mSprite; //スプライト }; #endif
hpp
#ifndef ___BULLET_HPP_ #define ___BULLET_HPP_ #include "DxLib.h" #include "glm/glm.hpp" #include "Actor.hpp" //#include "Entry.hpp" /*#################################################### * バレット(弾) * * 説明 * vectorで管理 * プレイヤーの攻撃 * ######################################################*/ class Bullet : public Actor { public: Bullet(glm::ivec2 pos, glm::ivec2 vec, int handle); //コンストラクタ ~Bullet(); //デストラクタ void Update(); //更新 void Draw(); //描画 private: int mSprite; //スプライト int mSpeed; //バレットの速度 }; #endif
cpp
#ifndef ___PLAYER_HPP_ #define ___PLAYER_HPP_ #include <iostream> #include <vector> //#include "Actor.hpp" //#include "Entry.hpp" #include "Input.hpp" #include "Bullet.hpp" #include "Collision.hpp" #define SPEED 10 /*#################################################### * プレイヤークラス ######################################################*/ //前方宣言 class Bullet; class Player : public Actor { public: Player(Entry* e); //コンストラクタ ~Player(); //デストラクタ void Update(); //更新 void Draw(); //描画 // バレット void Bullet_Update(); //更新 void Bullet_Draw(); //描画 //プレイヤー void Player_Update(); //更新 void Player_Draw(); //描画 bool getIsMenu(); //ショップ画面を開いているかどうか? void setIsMenu(bool b); // メニューを開くかどうか設定 void FixPos(glm::ivec2 pos); //当たり判定で座標を修正 Box_Collision mCol; //当たり判定 private: int mSprite; //プレイヤー スプライト int mBullet_Sprite; //バレット スプライト int mSpeed; //速度 std::shared_ptr<Input> mInput; //キー入力 std::vector<Bullet> mBullet; //バレット bool mMenu; //ショップ画面を開くかどうか? }; #endif
hpp
#ifndef ___ACTOR_HPP_ #define ___ACTOR_HPP_ #include "glm/glm.hpp" #include "dxlib.h" #include "Entry.hpp" /*#################################################### * アクター * * 説明 * 全てのゲームオブジェクトはこれを継承する。 ######################################################*/ class Actor { public: Actor(Entry* e,glm::ivec2 pos = glm::ivec2(0, 0), glm::ivec2 vec = glm::ivec2(0, 0)); //コンストラクタ ~Actor(); //デストラクタ void virtual Update() = 0; //計算 void virtual Draw() = 0; //描画 //取得関係 glm::ivec2 getVector(); //方向 glm::ivec2 getPosition(); //座標 protected: glm::ivec2 mPosition; //座標 glm::ivec2 mVector; //方向 glm::ivec2 mSize; //スプライトのサイズ Entry* Owner; //Entry クラス }; #endif
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++ アンダーバー 予約」とかなんとか検索すればそういう話を見つけられるかと.)
まだ回答がついていません
会員登録して回答してみよう