ページ 1 / 1
エラーが取れません。。。
Posted: 2014年12月17日(水) 21:55
by らいが
コード:
-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> この変換が可能なコンテキストはありません。
Re: エラーが取れません。。。
Posted: 2014年12月17日(水) 22:11
by みけCAT
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にするといいと思います。(最初のエラーを消さないとここも消えないと思いますが)
Re: エラーが取れません。。。
Posted: 2014年12月17日(水) 23:49
by nullptr
ファイル名がコードタグの中に入ってしまっています、エラーの該当行がどこなのかわかりづらいです。
おそらく、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();
};
Re: エラーが取れません。。。
Posted: 2014年12月18日(木) 00:04
by らいが
新さん、みけさん
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();
};
Re: エラーが取れません。。。
Posted: 2014年12月18日(木) 00:14
by nullptr
やはり、Enemy.hとPlayer.hが相互にインクルードされていますね。
ちゃんとインクルードガードされているのは素晴らしいですが、宣言の順番が面倒くさいことになっています。
おそらく、インクルードが展開された結果、
Enemyの宣言
Playerの宣言
という順番になってしまったのでしょう。
Player.hから
#include "Enemy.h"
を削除してください。
あと、先述したとおりEnemy.hもPlayer.hをインクルードする必要がありません。削除して前方宣言するだけで良いと思います。
また、Enemy.hもPlayer.hも#include "DxLib.h"をインクルードする必要はないはずです。cppの方でインクルードしてください。
そのファイルで必要なものだけインクルードするように気をつければこのような問題は起こらないとおもいます。
オフトピック
私もいつものチャットのノリで「みけ氏」とか言ってしまったのは悪かったですが、HNを略すほどの関係ではないのですから、変に略すのはよろしくないと思います。掲示板のマナー的に。
Re: エラーが取れません。。。
Posted: 2014年12月18日(木) 02:01
by らいが
新月さん、みけCATさん
ありがとうございます。なるほど、インクルードの記述、展開がおかしくて、このようなエラーがおこったのですね
途中からややこしくなってしまい、このようなことになってしまいました。以後整えるようにします。
HNはきちんというように心がけます。
Re: エラーが取れません。。。
Posted: 2014年12月18日(木) 02:30
by nullptr
実際に正しく動くかどうか確認して、正しく動いたら解決チェックマークを、しなければ引き続き報告して下さい。
捕捉をしておきます。Enemy.hでPlayer.hのインクルードが必要ないのは、Enemy.h内で、Player.hに記述されている型が使われていないからです。と言うと語弊がありますかね。問題になった20行目ではPlayerが使われています。
しかし、これはPlayer型ではなく、const Player&型です。constはどうでもよくて、参照型なのが重要です。参照の本性はポインタです。ポインタはサイズが一定であり、Playerそのもののサイズがわからなくても、Player型のポインタを実体化することができます。つまり、ここではPlayerの定義が無くても、Playerって名前の型があるよ、ということさえわかれば問題ないのです。そのため、Playerを前方宣言すれば、問題なくコンパイルできるはずです。
Re: エラーが取れません。。。
Posted: 2014年12月24日(水) 19:29
by らいが
申し訳ございません
皆さんのおかげで、エラーの原因、を理解することができました。