error C2061 構文エラー

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

error C2061 構文エラー

#1

投稿記事 by パコネコ » 8年前

エラーメッセージになります。

コード:

1>------ すべてのリビルド開始: プロジェクト: DigimonSTG, 構成: Debug Win32 ------
1>2012/02/22 1:43:26 にビルドを開始しました。
1>_PrepareForClean:
1>  ファイル "Debug\DigimonSTG.lastbuildstate" を削除しています。
1>InitializeBuildStatus:
1>  "Debug\DigimonSTG.unsuccessfulbuild" のタッチ タスクを実行しています。
1>ClCompile:
1>  World.cpp
1>c:\users\pakoneko\documents\program\digimonstg\ソース\enemy.h(15): error C2061: 構文エラー : 識別子 'c_Player'
1>c:\users\pakoneko\documents\program\digimonstg\ソース\enemy.h(16): error C2061: 構文エラー : 識別子 'c_Player'
1>c:\users\pakoneko\documents\program\digimonstg\ソース\enemy.h(17): error C2061: 構文エラー : 識別子 'c_Player'
1>c:\users\pakoneko\documents\program\digimonstg\ソース\enemy.h(18): error C2061: 構文エラー : 識別子 'c_Player'
1>  Player.cpp
1>c:\users\pakoneko\documents\program\digimonstg\ソース\enemy.h(15): error C2061: 構文エラー : 識別子 'c_Player'
1>c:\users\pakoneko\documents\program\digimonstg\ソース\enemy.h(16): error C2061: 構文エラー : 識別子 'c_Player'
1>c:\users\pakoneko\documents\program\digimonstg\ソース\enemy.h(17): error C2061: 構文エラー : 識別子 'c_Player'
1>c:\users\pakoneko\documents\program\digimonstg\ソース\enemy.h(18): error C2061: 構文エラー : 識別子 'c_Player'
1>  mBase.cpp
1>  main.cpp
1>c:\users\pakoneko\documents\program\digimonstg\ソース\enemy.h(15): error C2061: 構文エラー : 識別子 'c_Player'
1>c:\users\pakoneko\documents\program\digimonstg\ソース\enemy.h(16): error C2061: 構文エラー : 識別子 'c_Player'
1>c:\users\pakoneko\documents\program\digimonstg\ソース\enemy.h(17): error C2061: 構文エラー : 識別子 'c_Player'
1>c:\users\pakoneko\documents\program\digimonstg\ソース\enemy.h(18): error C2061: 構文エラー : 識別子 'c_Player'
1>  Key.cpp
1>  Game_Main.cpp
1>c:\users\pakoneko\documents\program\digimonstg\ソース\enemy.h(15): error C2061: 構文エラー : 識別子 'c_Player'
1>c:\users\pakoneko\documents\program\digimonstg\ソース\enemy.h(16): error C2061: 構文エラー : 識別子 'c_Player'
1>c:\users\pakoneko\documents\program\digimonstg\ソース\enemy.h(17): error C2061: 構文エラー : 識別子 'c_Player'
1>c:\users\pakoneko\documents\program\digimonstg\ソース\enemy.h(18): error C2061: 構文エラー : 識別子 'c_Player'
1>  GameMode.cpp
1>  Field.cpp
1>  EnemyAll.cpp
1>c:\users\pakoneko\documents\program\digimonstg\ソース\bulletall.h(24): error C2061: 構文エラー : 識別子 'c_Enemy'
1>  Enemy.cpp
1>c:\users\pakoneko\documents\program\digimonstg\ソース\bulletall.h(24): error C2061: 構文エラー : 識別子 'c_Enemy'
1>  BulletAll.cpp
1>c:\users\pakoneko\documents\program\digimonstg\ソース\player.h(8): error C2143: 構文エラー : ';' が '*' の前にありません。
1>c:\users\pakoneko\documents\program\digimonstg\ソース\player.h(8): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>c:\users\pakoneko\documents\program\digimonstg\ソース\player.h(8): error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません
1>c:\users\pakoneko\documents\program\digimonstg\ソース\player.h(12): error C2061: 構文エラー : 識別子 'c_BulletAll'
1>  Bullet.cpp
1>  コードを生成中...
1>
1>ビルドに失敗しました。
1>
1>経過時間 00:00:23.34
========== すべてリビルド: 0 正常終了、1 失敗、0 スキップ ==========
とにかくエラーコードは全部そのまま貼り付けさせてもらいました。

error C2061: 構文エラー
でしたらべて見たところ 継承あたりのせい?ようなことを書いてるところもありましたが、対処法がよくわかりませんでした。
以下関係ありそうな、ヘッダーファイルを貼り付けさせてもらいます。
(無駄に行数を使って見づらかったりしたらごめんなさい)

まず直接エラーはいてる ここ

コード:

#ifndef DEF_ENEMY_H
#define DEF_ENEMY_H
#include "Player.h"
#include "Base.h"
class c_Enemy:public c_Base{
	int mMode;
	int mCount;
public:
	c_Enemy(double X,double Y,int SizeX,int SizeY,int Hp,int Mode,int Img);
	~c_Enemy();
public:
	int aMove(void);
	int aDraw(void);
	//
	int aInput(c_Player*);
	int aInput_00(c_Player*);
	int aInput_01(c_Player*);
	int aInput_02(c_Player*);
};
#endif//DEF_ENEMY_H
このaInputシリーズの引数のc_Playerが問題あるようなのですが・・・

次はPlayerです

コード:

#ifndef DEF_PALYER_H
#define DEF_PALYER_H
#include "GameMode.h"
#include "BulletAll.h"
#include "Base.h"
class c_Player:public c_Base{
	c_GameMode *mGameMode;
	c_BulletAll *mBulletAll;
public:
	double mSpeed;
public:
	c_Player(c_GameMode*,c_BulletAll*);
	~c_Player();
public:
	int aInput(void);
	int aMove(void);
	void aDraw(void);
};

#endif//DEF_PALYER_H
あ、コメントほとんど書いて無い・・・
ヘッダーファイルだけなら大丈夫かな・・・もし回答に必要な情報がありましたら、指摘してください。
(不備があってすいません)

ライスとに

コード:

/*
** 継承用クラス
** キャラや敵などに継承させる。
**
*/

#ifndef DEF_BASE_H
#define DEF_BASE_H

class c_Base{
public:
	enum{
		TURN_LEFT,
		TURN_RIGHT,
	};
	int mImg;
	int mTime;
	int mTurn;
	int mHp,mMaxHp;
	double mX,mY;
	double mSpeedX,mSpeedY;
	int mSizeX,mSizeY;
public:
	c_Base(void);
	~c_Base();
};
#endif//DEF_BASE_H
これが継承させるクラスです。

Dxライブラリを使用しており、
言語はC++
環境は VisualStudioAcademic (2010かな?)です。

継承はこのプログラムから使い始めたのでとんでもない書き方をしてしまってるかも知れないのですが、もしなにかお気づきになられる場所がありましたら指摘してください。
お願いします。

・・・・・・・・・・・・・・・・・・・・・・・・・・・・
失礼しました。追記です
何を知りたいのか書き忘れてました。
エラーが出ている原因が知りたいです。
このエラーはなぜ出るものなのでしょうか?
継承が関係しているものなのでしょうか?
よろしくお願いします。
ニャン!!\(゜ロ\)(/ロ゜)/

アバター
DVDM
記事: 38
登録日時: 9年前
住所: 大阪
連絡を取る:

Re: error C2061 構文エラー

#2

投稿記事 by DVDM » 8年前

>>パコネコさん
中途半端にしか見ていないので間違っているかもしれませんが、
前方宣言をしていないためエラーが出ているように思います。

class c_Enemy:public c_Base{ の上に
class c_Player;
を追加してみるとどうなるでしょうか。

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: error C2061 構文エラー

#3

投稿記事 by YuO » 8年前

"GameMode.h"または"BulletAll.h"から,直接または間接に"Enemy.h"をインクルードしていませんか。
たとえば,"GameMode.h"が",単純化して

コード:

#pragma once
#include "Enemy.h"
だったとすると,

コード:

#include "Player.h"
は,本来の順序と逆でコメントを残しプリプロセッサを展開すると,

コード:

/*
** 継承用クラス
** キャラや敵などに継承させる。
**
*/
 
class c_Base{
public:
    enum{
        TURN_LEFT,
        TURN_RIGHT,
    };
    int mImg;
    int mTime;
    int mTurn;
    int mHp,mMaxHp;
    double mX,mY;
    double mSpeedX,mSpeedY;
    int mSizeX,mSizeY;
public:
    c_Base(void);
    ~c_Base();
};

class c_Enemy:public c_Base{
    int mMode;
    int mCount;
public:
    c_Enemy(double X,double Y,int SizeX,int SizeY,int Hp,int Mode,int Img);
    ~c_Enemy();
public:
    int aMove(void);
    int aDraw(void);
    //
    int aInput(c_Player*);
    int aInput_00(c_Player*);
    int aInput_01(c_Player*);
    int aInput_02(c_Player*);
};
#include "BulletAll.h"
class c_Player:public c_Base{
    c_GameMode *mGameMode;
    c_BulletAll *mBulletAll;
public:
    double mSpeed;
public:
    c_Player(c_GameMode*,c_BulletAll*);
    ~c_Player();
public:
    int aInput(void);
    int aMove(void);
    void aDraw(void);
};
のようになります。"BulletAll.h"は中身を定義しなかったので残しています。

解決方法はDVDMさんが書かれているように宣言することです。

たとえば,c_Enemyクラスの定義にc_Playerの宣言は必要ですが定義は不要です。
この場合,c_Playerクラスの為に"Player.h"をインクルードせずに

コード:

class c_Player;
で済ます,というのは手段になります。
また,逆に"Player.h"でインクルードの前に定義するクラスの宣言だけ先にしてしまうのも方法の一つです。

コード:

#ifndef DEF_PALYER_H
#define DEF_PALYER_H
class c_Player; // この1行を追加。
#include "GameMode.h"
#include "BulletAll.h"
#include "Base.h"
class c_Player:public c_Base{
    c_GameMode *mGameMode;
    c_BulletAll *mBulletAll;
public:
    double mSpeed;
public:
    c_Player(c_GameMode*,c_BulletAll*);
    ~c_Player();
public:
    int aInput(void);
    int aMove(void);
    void aDraw(void);
};
 
#endif//DEF_PALYER_H
ヘッダファイルの依存関係を減らす,という切り口からは"Enemy.h"に宣言を書くのがよいですが,
そもそもバラバラに書くと管理しにくい,という切り口からは"Player.h"に宣言を書くことになります。
どちらを使うかは,使いやすい方法にすればよいと思います。

アバター
パコネコ
記事: 139
登録日時: 9年前
住所: 大阪

Re: error C2061 構文エラー

#4

投稿記事 by パコネコ » 8年前

>>DVDMさん
おっしゃっているとおりに、前方宣言を追加させていただいたところその追加した場所のエラーがぴたりと消えました。
ですが、何とかヘッダファイル内に抑えれないかとやり方を調べていたところ返信が遅くなってしまいました。
遅くなってしまいすいませんでした。
回答ありがとうございました。
おかげで助かりました。

>>YuOさん
おっしゃるとおり、BulletAll.hよりEnemy.hをインクルードしていました。
見事にYuOさんの提案してくださった方法を調べたくて調べているところでした。
インクルードファイルの下に書いてしまっていたので、自力ではたどり着けなかったかもしれません。
回答ありがとうございました。

うまくヘッダの中にまとめることが、できたましたので解決にさせていただきます。
お二人ともわざわざありがとうございました。
ニャン!!\(゜ロ\)(/ロ゜)/

閉鎖

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