オペランドと一致する演算子”=”がない

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

オペランドと一致する演算子”=”がない

#1

投稿記事 by mattun » 2年前

敵を複数出現したいのですが
敵クラスを生成するときに
「オペランドと一致する演算子”=”はありません」とエラーが
出てしまいます

分かる方がいましたら
教えていただきたいです。

下記サイトを見ながら制作しています
http://bituse.info/game/shot/11

コード:

[enemy.h]
class ENEMY {
private:
	//座標とグラフィックハンドル 
	double x, y;
	int gh[3];

	//画像サイズ 
	int width, height;

	//出現、停止、帰還、発射タイミング 
	int in_time, stop_time, out_time, shot_time;

	//敵の種類 
	int type;

	//弾の種類 
	int stype;

	//移動パターン 
	int m_pattern;

	//ショットパターン 
	int s_pattern;

	//HP
	int hp;

	//アイテム
	int item;

	//敵が出現してからのカウント 
	int count;

	//敵消滅フラグ 
	bool deadflag;

	//敵クラス消滅フラグ 
	bool endflag;

	//弾構造体 
	E_SHOT shot[ENEMY_SNUM];

	//ショットが撃てるようになったかのフラグ 
	bool sflag;

	//ショットが打てるようになってからのカウント 
	int scount;

public:
	bool All();
	void Move();
	void Shot();
	void Draw();
	ENEMY(int type, int stype, int m_pattern, int s_pattern, int in_time, int stop_time, int shot_time, int out_time,
		int x, int y, int speed, int hp, int item);
};

コード:

[enemy.cpp]
#include"enemy.h"

ENEMY::ENEMY(int type, int stype,int m_pattern,int s_pattern,int in_time,int stop_time, int shot_time, int out_time,
	int x, int y, int speed, int hp, int item)
{
	//サイズ 
	width = 27;
	height = 25;

	//敵の種類 
	this->type = type;
	this->stype = stype;

	//移動パターンとショットパターン 
	this->m_pattern = m_pattern;
	this->s_pattern = s_pattern;

	//座標セット 
	this->x = x;
	this->y = y;

	//出現、停止、発射、帰還時間セット 
	this->in_time = in_time;
	this->stop_time = stop_time;
	this->shot_time = shot_time;
	this->out_time = out_time;

	//HPとアイテム代入
	this->hp = hp;
	this->item = item;

	//敵画像読み込み
	if (type == 0)
	{
		LoadDivGraph("DATA/BG/enemy.png", 3, 1, 3, 27, 25, gh);
	}

	int temp;
	//弾画像読み込み
	if (stype == 0)
	{
		temp = LoadGraph("DATA/BG/enemyshot1.png");
	}

	int w, h;
	GetGraphSize(temp, &w, &h);

	//弾の初期化 
	for (int i = 0; i < ENEMY_SNUM; ++i)
	{
		shot[i].flag = false;
		shot[i].gh = temp;
		shot[i].width = w;
		shot[i].height = h;
		shot[i].pattern = s_pattern;
		shot[i].speed = speed;
		shot[i].x = x;
		shot[i].y = y;
	}


	count = 0;
	scount = 0;

	deadflag = false;
	endflag = false;
	sflag = false;
}



void ENEMY::Move()
{
	//出てきてから止まる時間までの間なら下に移動 
	if (in_time < g_count && g_count < stop_time) 
	{
		y += 2;
		//帰還時間を過ぎたら戻る。 
	}

	else if (g_count > out_time)
	{
		y -= 2;
		if (y < -40)
		{
			endflag = true;
		}

	}

}

void ENEMY::Shot()
{
	//発射タイミングになったら、フラグを立てる 
	if (shot_time == g_count) 
	{
		sflag = true;
	}

	//フラグ立ってるときだけ 
	if (sflag) {
		switch (s_pattern) {
		case 0:
			//10回に一回発射。40までなので5発発射。 
			if (scount % 10 == 0 && scount <= 40) 
			{
				for (int i = 0; i < ENEMY_SNUM; ++i) 
				{
					//フラグが立ってない弾を探して、座標等をセット 
					if (shot[i].flag == false) 
					{
						shot[i].flag = true;
						shot[i].x = x;
						shot[i].y = y;
						break;
					}
				}
			}
			break;
		}
		//フラグが立ってる弾の数 
		int s = 0;

		//フラグ立ってる弾だけ、弾の移動を行う 
		for (int i = 0; i < ENEMY_SNUM; ++i) 
		{
			if (shot[i].flag) 
			{
				shot[i].y += shot[i].speed;
				//弾が画面をはみ出たらフラグを戻す。 
				if (shot[i].x < -20 || shot[i].x>420 || shot[i].y < -20 || shot[i].y>500) 
				{
					shot[i].flag = false;
					continue;

				}
				++s;
			}

		}

		//sがゼロということは発射中の弾がない。 
		//かつdeadflagがTRUEということはこの敵のクラスは消滅させてもよい 
		if (s == 0 && deadflag) 
		{
			//敵クラス消滅フラグをTRUEにする 
			endflag = true;
		}
		++scount;
	}

}


void ENEMY::Draw()
{
	int temp;

	//弾から最初に描画 
	for (int i = 0; i < ENEMY_SNUM; ++i)
	{
		if (shot[i].flag)
		{
			DrawGraph(shot[i].x, shot[i].y, shot[i].gh, true);
		}
	}

	if (!endflag)
	{
		temp = count % 40 / 10;
		if (temp == 3)
			temp = 1;
		DrawGraph(x, y, gh[temp], TRUE);
	}

}

bool ENEMY::All()
{
	Move();
	Shot();
	Draw();

	++count;

	return endflag;
}

コード:

[control.h]
#include"enemy.h"

class CONTROL{
private:

	//エネミークラス
	ENEMY *enemy;

public:
	CONTROL();
	~CONTROL();
	void All();
};

コード:

[control.cpp]
#include "control.h"

CONTROL::CONTROL()
{
	FILE *fp;
	ENEMY_DATA data[ENEMY_NUM];
	char buf[100];
	int c;
	int col = 1;
	int row = 0;

	memset(buf, 0, sizeof(buf));
	fp = fopen("enemydata.csv", "r");

	//ヘッダ読み飛ばし
	while (fgetc(fp) != '\n');

	while (1) {

		while (1) {

			c = fgetc(fp);

			//末尾ならループを抜ける。
			if (c == EOF)
				goto out;

			//カンマか改行でなければ、文字としてつなげる
			if (c != ',' && c != '\n')
				strcat(buf, (const char*)&c);
			//カンマか改行ならループ抜ける。
			else
				break;
		}
		//ここに来たということは、1セル分の文字列が出来上がったということ
		switch (col) {
			//1列目は敵種類を表す。atoi関数で数値として代入。
		case 1:	data[row].type = atoi(buf); break;
			//2列目は弾種類。以降省略。
		case 2: data[row].stype = atoi(buf); break;
		case 3: data[row].m_pattern = atoi(buf); break;
		case 4: data[row].s_pattern = atoi(buf); break;
		case 5: data[row].in_time = atoi(buf); break;
		case 6: data[row].stop_time = atoi(buf); break;
		case 7: data[row].shot_time = atoi(buf); break;
		case 8: data[row].out_time = atoi(buf); break;
		case 9: data[row].x = atoi(buf); break;
		case 10: data[row].y = atoi(buf); break;
		case 11: data[row].speed = atoi(buf); break;
		case 12: data[row].hp = atoi(buf); break;
		case 13: data[row].item = atoi(buf); break;
		}
		//バッファを初期化
		memset(buf, 0, sizeof(buf));
		//列数を足す
		++col;

		//もし読み込んだ文字が改行だったら列数を初期化して行数を増やす
		if (c == '\n') {
			col = 1;
			++row;
		}
	}
out:

	//敵クラス生成
	for (int i = 0; i<ENEMY_NUM; ++i) 
	{
                 [color=#FF0000]//ここのenemy[i]=の所でエラーが出ます[/color]
		enemy[i] = new ENEMY(data[i].type, data[i].stype, data[i].m_pattern, data[i].s_pattern, data[i].in_time, data[i].stop_time, data[i].shot_time,
			data[i].out_time, data[i].x, data[i].y, data[i].speed, data[i].hp, data[i].item);
	}

}

void CONTROL::All()
{
	//描画領域を指定
	SetDrawArea(MARGIN, MARGIN, MARGIN + 380, MARGIN + 460);

	for (int i = 0; i<ENEMY_NUM; ++i) {
      [color=#FF0000]//ここのenemy[i]!=の所でエラーが出ます[/color]
		if (enemy[i] != NULL) {
			if (enemy[i]->All()) {
				delete enemy[i];
				enemy[i] = NULL;
			}
		}
	}
	++g_count;
}

CONTROL::~CONTROL()
{
	for (int i = 0; i<ENEMY_NUM; ++i) {
[color=#FF0000]//ここのenemy[i]!=の所でエラーが出ます[/color]
		if (enemy[i] != NULL) {
			delete enemy[i];
		}
	}
}

box
記事: 1719
登録日時: 8年前

Re: オペランドと一致する演算子”=”がない

#2

投稿記事 by box » 2年前

mattun さんが書きました: 「オペランドと一致する演算子”=”はありません」とエラーが
せめて、どのソースコードの何行目でエラーが出ているかくらいは教えていただきたいところです。
エラーメッセージに書いてあるはずです。
まぁ、自分が回答できるかどうかはともかく。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: オペランドと一致する演算子”=”がない

#3

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

ENEMY型のオブジェクトにENEMY*のデータを代入したり比較したりしようとしているが、それらを扱う演算子がオーバーロード(定義)されていないということですね。
CONTROLクラスのメンバenemyの宣言をENEMY *enemy; (ENEMYへのポインタ)からENEMY *enemy[ENEMY_NUM]; (ENEMYへのポインタの配列)にするといいでしょう。
オフトピック
このコードだと、ENEMY_NUMの定義は見えないが定数である気がするので、データファイルを書き換えるだけでは敵の数を変えることができず、
間違った仕様とは言えないが、やばそうな臭いがしますね。
配列ではなくstd::listを使うほうがいいかもしれません。
まあ、まずは動くものを作ることが優先かもしれないですが。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

mattun

Re: オペランドと一致する演算子”=”がない

#4

投稿記事 by mattun » 2年前

出来ました!
ありがとうございます!

閉鎖

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