既に宣言されたクラスを使うとエラーが出る。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
DreadNorght
記事: 9
登録日時: 7年前

既に宣言されたクラスを使うとエラーが出る。

#1

投稿記事 by DreadNorght » 7年前

ここのページ( https://bituse.info/game/shot/9 )で行われている敵を表示するところを進めています。
しかし、敵関連のクラスをヘッダで宣言しているにも関わらずエラーが出てしまいます。Visual Studioのコードを書く部分にも赤線が出ないため修正部分がわかりません。解決方法を教えてください。ヘッダファイルやcppファイルは以下のとおりです。
enemy.hのエラーは「'ENEMY':'class'型の再定義」
control.cppのエラー「認識できない型'ENEMY'が使われています(3行目)(34行目)」
「'->All':左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません(34行目)」
以上がエラーになります。

コード:

//enemy.h
//敵関連のクラス

class ENEMY{
private:
	//画像座標
	double x, y;
	//グラフィックハンドル
	int gh[3];
	//画像幅、高さ
	int width, height;
	//動きの時間
	int in_time, stop_time, out_time;
	//カウント
	int count;
	//画面外に出たかどうかのフラグ
	bool endflag;
public:
	bool All();
	void Move();
	void Draw();
	ENEMY();
};

コード:

//control.h
#include "player.h"
#include "BACK.h"
#include "enemy.h"

//player.hではPLAYERクラスの宣言
//BACK.hでは背景クラスの宣言

class CONTROL {
private:
	//プレイヤークラスのポインタ
	PLAYER * player;
	//背景クラスのポインタ
	BACK * back;
	//エネミークラスのポインタ
	ENEMY * enemy;
public:
	CONTROL();
	~CONTROL();
	void All();
};

コード:

//control.cpp
#include "pch.h"
#include "enemy.h"
#include "control.h"


CONTROL::CONTROL()
{
	//プレイヤークラスの生成
	player = new PLAYER;
	//背景クラスの作成
	back = new BACK;
	//ENEMYクラスの生成
	enemy = new ENEMY;
}

CONTROL::~CONTROL()
{
	//プレイヤークラスの開放
	delete player;
}

void CONTROL::All()
{
	//描写領域を設定
	SetDrawArea (MARGIN,MARGIN,MARGIN+380,MARGIN+460);   //MARGINは他のヘッダで10と定義しています
	
	//背景クラスのAll関数実行
	back->All();

	//プレイヤークラスのAll関数実行
	player->All();

	if (enemy != NULL) {   //control.hでポインターを宣言
		if (enemy->All()) {
			delete enemy;
			enemy = NULL;
		}
	}
	++g_count;
}

MψGёN

Re: 既に宣言されたクラスを使うとエラーが出る。

#2

投稿記事 by MψGёN » 7年前

循環参照とか…?
俺がこの手のエラーを見るときは結構循環参照やらかしてたりはする

maru
記事: 150
登録日時: 14年前

Re: 既に宣言されたクラスを使うとエラーが出る。

#3

投稿記事 by maru » 7年前

多重インクルードされていることが原因。
enemy.h が control.h でインクルードされていて、さらに control.cpp
で enemy.h と control.h の両方がインクルードされているので、ENEMY が
多重に定義されている。そのためにclass再定義というエラーが発生している。

対策は3つほど浮かぶ。
1.control.cpp から enemy.h のインクルードを削除する。
2.ヘッダファイルの先頭に #pragma once を追加する。
3.インクルードガードを行う。(下記参照)

コード:

#ifndef xxxx_h_include	// include guard xxxx はファイル毎に固有なものにする!
#define xxxx_h_include
// ヘッダーファイルの本体
#endif	// end of include guard

DreadNorght
記事: 9
登録日時: 7年前

Re: 既に宣言されたクラスを使うとエラーが出る。

#4

投稿記事 by DreadNorght » 7年前

enemy.hのインクルードを削除してみたところ無事解決しました。ありがとうございました。

返信

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