エラーが取れません。。。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
らいが

エラーが取れません。。。

#1

投稿記事 by らいが » 6年前

コード:

-Enemy.h-

#pragma once

#include "DxLib.h"
#include "Types.h"
#include "Player.h"

class Enemy
{
	Point2D e;
	bool isBulletEnemyHit;
	int e_graph;

public:
	Enemy(const Point2D& e_);

	int e_x();
	int e_y();
	void draw();
	void move();
	bool isInsector(const Player& Pl) const;
	Point2D rePoint();
};

コード:


-Enemy.cpp-
#include "Enemy.h"
#include "Globals.h"

Enemy::Enemy(const Point2D& e_)
	: e(e_), isBulletEnemyHit(false) 
{
	e_graph = LoadGraph("passer画像/とりんドル.png");
}

void Enemy::draw()
{
	DrawGraph(e.x, e.y, e_graph, TRUE);
}

void Enemy::move()
{
	//e.x ++;
}

bool Enemy::isInsector(const Player& Pl) const
{
	if(e.x >= Pl.bulletPos_x()){
		printfDx("fds");
	}

	return TRUE;
}

Point2D Enemy::rePoint()
{
	DrawFormatString(450, 40, GetColor(255, 255, 255), "敵座標(%d, %d)", e.x, e.y);

	return e;
}

コード:


-PlayScene.cpp-

#include "PlayScene.h"
#include "Globals.h"

PlayScene::PlayScene()//PlaySceneで呼び出されている、PlayScene関数の処理定義
{
	player = new Player(Point2D(320, 240));//playerの初期化
	enemy = new Enemy(Point2D(200, 200));
	mouseCursor = new MouseCursor();
}

PlayScene::~PlayScene()
{
	delete player;
	delete enemy;
	delete mouseCursor;
}

void PlayScene::draw()//PlaySceneで呼び出されているdraw関数の処理定義
{
	player->draw();//playerクラスのdraw関数を呼び出す
	player->rePoint();

	enemy->draw();
	enemy->rePoint();
}

void PlayScene::update(MouseCursor *mouseCursor)
{	
	mouseCursor->move();

	player->move(mouseCursor);
	player->shot(mouseCursor);
	
	enemy->move();
	enemy->isInsector(player);
		
	if( CheckHitKey(KEY_INPUT_Q) ){
		currentScene = gameoverScene;
	}
}




このプログラムをビルドすると
以下のようなエラーが出て何が原因なのかわかりません。
どなたか教えてください

[c:\users\test\downloads\passer\gameprog\enemy.h(20): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>c:\users\test\downloads\passer\gameprog\enemy.h(20): error C2143: 構文エラー : ',' が '&' の前にありません。
1> Enemy.cpp

1>c:\users\test\downloads\passer\gameprog\playscene.cpp(35): error C2664: 'Enemy::isInsector' : 1 番目の引数を 'Player *' から 'const int' に変換できません。(新しい機能 ; ヘルプを参照)
1> この変換が可能なコンテキストはありません。

アバター
みけCAT
記事: 6345
登録日時: 10年前
住所: 千葉県
連絡を取る:

Re: エラーが取れません。。。

#2

投稿記事 by みけCAT » 6年前

Types.hとPlayer.hの中身はどうなっていますか?
らいが さんが書きました:1>c:\users\test\downloads\passer\gameprog\playscene.cpp(35): error C2664: 'Enemy::isInsector' : 1 番目の引数を 'Player *' から 'const int' に変換できません。(新しい機能 ; ヘルプを参照)
1> この変換が可能なコンテキストはありません。
これは、とりあえず該当行のplayerを*playerにするといいと思います。(最初のエラーを消さないとここも消えないと思いますが)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
nullptr
記事: 239
登録日時: 8年前

Re: エラーが取れません。。。

#3

投稿記事 by nullptr » 6年前

ファイル名がコードタグの中に入ってしまっています、エラーの該当行がどこなのかわかりづらいです。
おそらく、22行目の「bool isInsector(const Player& Pl) const;」が、本来の20行目…なのだと思います。そう仮定した場合、Playerが宣言されていない、認識できない、不完全などの理由で、無理やりintと仮定したけど、それっておかしくねえ?というエラーが出たのだと思います。
みけ氏の言うようにTypes.hとPlayer.hの中身を見ないと断定はできませんが、Enemy.hの
#include "Player.h"
は削除してしまい、代わりに
class Enemy
の直前あたりに
struct Player;
と記述すれば、動く可能性が高いと思います。
※Point2DがTypes.hに定義されていると仮定しています。

どうして認識できないかってのは、循環インクルードとかそういうのですかね。中身がわからない以上断定できないし知りませんけど。

コード:

#pragma once
 
#include "DxLib.h"
#include "Types.h"

struct Player;
 
class Enemy
{
    Point2D e;
    bool isBulletEnemyHit;
    int e_graph;
 
public:
    Enemy(const Point2D& e_);
 
    int e_x();
    int e_y();
    void draw();
    void move();
    bool isInsector(const Player& Pl) const;
    Point2D rePoint();
};
 
 
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
?
Is the は :
order C++? ✜
     糸冬   
  ――――――――
  制作・著作 NHK
 
 

らいが

Re: エラーが取れません。。。

#4

投稿記事 by らいが » 6年前

新さん、みけさん
types playerの中身はこの通りです

-types.h-

コード:


#pragma once

struct Point2D {
	int x, y;

	//x,y軸の値を取得
	Point2D() : x(0), y(0) {}
	Point2D(int x_, int y_) : x(x_), y(y_) {}
	Point2D(const Point2D& pos) : x(pos.x), y(pos.y) {}
};

-Player.h-

コード:


#pragma once

#include "DxLib.h"
#include "MouseCursor.h"
#include "Types.h"
#include "Enemy.h"

class Player
{
	Point2D pos;
	Point2D e;
	Point2D bulletPos;//bulletPosに(x,y)の概念を与える
	Point2D bulletMoveSize;
	Point2D ret;
	Point2D mousePos;
	bool isShooting;
	bool isPlayerAndEnemyHit;
	int p_graph;
	double angle;
	int handgun_graph;

public:
	Player(const Point2D& pos_);//Point2Dをpos_とする

	int pos_x() const;
	int pos_y() const;
	int bulletPos_x() const;
	int bulletPos_y() const;
	void draw();
	void move(MouseCursor *mouseCursor);
	void shot(MouseCursor *mouseCursor);

	Point2D calcBulletMoveSize(const Point2D& mousePos);
	Point2D rePoint();
};


アバター
nullptr
記事: 239
登録日時: 8年前

Re: エラーが取れません。。。

#5

投稿記事 by nullptr » 6年前

やはり、Enemy.hとPlayer.hが相互にインクルードされていますね。
ちゃんとインクルードガードされているのは素晴らしいですが、宣言の順番が面倒くさいことになっています。
おそらく、インクルードが展開された結果、
Enemyの宣言
Playerの宣言
という順番になってしまったのでしょう。

Player.hから
#include "Enemy.h"
を削除してください。

あと、先述したとおりEnemy.hもPlayer.hをインクルードする必要がありません。削除して前方宣言するだけで良いと思います。

また、Enemy.hもPlayer.hも#include "DxLib.h"をインクルードする必要はないはずです。cppの方でインクルードしてください。
そのファイルで必要なものだけインクルードするように気をつければこのような問題は起こらないとおもいます。

オフトピック
私もいつものチャットのノリで「みけ氏」とか言ってしまったのは悪かったですが、HNを略すほどの関係ではないのですから、変に略すのはよろしくないと思います。掲示板のマナー的に。
 
 
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
?
Is the は :
order C++? ✜
     糸冬   
  ――――――――
  制作・著作 NHK
 
 

らいが

Re: エラーが取れません。。。

#6

投稿記事 by らいが » 6年前

新月さん、みけCATさん
ありがとうございます。なるほど、インクルードの記述、展開がおかしくて、このようなエラーがおこったのですね
途中からややこしくなってしまい、このようなことになってしまいました。以後整えるようにします。

HNはきちんというように心がけます。

アバター
nullptr
記事: 239
登録日時: 8年前

Re: エラーが取れません。。。

#7

投稿記事 by nullptr » 6年前

実際に正しく動くかどうか確認して、正しく動いたら解決チェックマークを、しなければ引き続き報告して下さい。

捕捉をしておきます。Enemy.hでPlayer.hのインクルードが必要ないのは、Enemy.h内で、Player.hに記述されている型が使われていないからです。と言うと語弊がありますかね。問題になった20行目ではPlayerが使われています。
しかし、これはPlayer型ではなく、const Player&型です。constはどうでもよくて、参照型なのが重要です。参照の本性はポインタです。ポインタはサイズが一定であり、Playerそのもののサイズがわからなくても、Player型のポインタを実体化することができます。つまり、ここではPlayerの定義が無くても、Playerって名前の型があるよ、ということさえわかれば問題ないのです。そのため、Playerを前方宣言すれば、問題なくコンパイルできるはずです。
 
 
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
?
Is the は :
order C++? ✜
     糸冬   
  ――――――――
  制作・著作 NHK
 
 

らいが

Re: エラーが取れません。。。

#8

投稿記事 by らいが » 6年前

申し訳ございません

皆さんのおかげで、エラーの原因、を理解することができました。

閉鎖

“C言語何でも質問掲示板” へ戻る