ページ 1 / 1
C++エラーLNK2005
Posted: 2012年3月21日(水) 19:54
by Rul
[1] 質問文
[1.1] 自分が今行いたい事は何か:C++でクラスを用いてゲーム制作
[1.2] どのように取り組んだか(プログラムコードがある場合記載)
[1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載):1>load.obj : error LNK2005: "class Player * ch_t" (?ch_t@@3PAVPlayer@@A) は既に graph.obj で定義されています。
[1.4] 今何がわからないのか、知りたいのか
このエラーの解決方法
[2] 環境
[2.1] OS : Windows7
[2.2] コンパイラ名 : VC++2010
[3] その他
・どの程度C言語を理解しているか:初心者
・ライブラリを使っている場合は何を使っているか:DxLib
よろしくお願いいたします。
Re: C++エラーLNK2005
Posted: 2012年3月21日(水) 20:04
by h2so5
どこかで二重に定義してる部分があるというエラーです。
ソースコードを投稿してもらったほうが早いと思います。
Re: C++エラーLNK2005
Posted: 2012年3月21日(水) 20:09
by Rul
コード:
//player.h
#ifndef INCLUDE_PLAYER_H
#define INCLUDE_PLAYER_H
#include "main.h"
//クラスの定義
class Player
{
public:
int cnt; //カウンタ
int power; //パワー
int point; //ポイント
int score; //スコア
int num; //残機数
int mutekicnt; //無敵状態とカウント
int shot_mode; //ショットモード
int money; //お金
bool slow; //スローかどうか
double x,y; //座標
bool ShootFlag;
int img;//画像
//プレイヤーの初期化
int PlayerInitialize( double x, double y, int cnt, int power, int point, int score, int num, int mutekicnt, int shot_mode, int money,
int img, bool slow, bool shootflag);
} *ch_t;
#endif
//load.cpp
#include "load.h"
void Load::load(){
LoadDivGraph( "../Sh/img/0.png" , 12 , 4 , 3 , 73 , 73 , &load_t->img_ch[2][12] );
}
//load.h
#ifndef INCLUDE_LOAD_H
#define INCLUDE_LOAD_H
#include "main.h"
class Load
{
public:
int img_ch[2][12];//キャラ画像読み込み
void load(); //ロード関数
}*load_t;
#endif
//graph.cpp
#include "graph.h"
void graph_ch(){
DrawRotaGraphF( ch_t->x, ch_t->y,1.0f,0.0f, load_t->img_ch[0][ch_t->img],TRUE);
}
void graph_main(){
graph_ch();
}
//graph.h
#ifndef INCLUDE_GRAPH_H
#define INCLUDE_GRAPH_H
#include "main.h"
class Graph
{
public:
void graph_ch();//キャラクター描画関数
void graph_main();//描画メイン制御
};
#endif
Re: C++エラーLNK2005
Posted: 2012年3月21日(水) 20:15
by h2so5
main.h と main.cpp のソースはどうなっていますか?
Re: C++エラーLNK2005
Posted: 2012年3月21日(水) 20:21
by Rul
コード:
//main.h
#ifndef INCLUDE_MAIN_H//インクルードガード
#define INCLUDE_MAIN_H
#define SCREEN_WIDE 640.0
#define SCREEN_HIGH 320.0
#include "DxLib.h"
#include "math.h"
#include "player.h"
#include "load.h"
#include "graph.h"
#endif
//main.cpp
#include "main.h"
int Key[256];//キー入力チェックの際の配列
int gpUpdateKey(){
char tmpKey[256]; // 現在のキーの入力状態を格納する
GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
for( int i=0; i<256; i++ ){
if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
Key[i]++; // 加算
}
else { // 押されていなければ
Key[i] = 0; // 0にする
}
}
return 0;
}
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
int x=0;
// while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キーの状態更新)
while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0){
//計算処理
break;
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}
Re: C++エラーLNK2005
Posted: 2012年3月21日(水) 20:27
by Rul
これで大丈夫でしょうか?
淡白な質問分で申し訳ないです。
Re: C++エラーLNK2005
Posted: 2012年3月21日(水) 20:36
by h2so5
ファイル分割の仕方に問題があります。
各ヘッダファイルでmain.hをインクルードしていますが、
main.hでその各ヘッダファイルをインクルードしているため循環してヘッダファイルが何度もインクルードされてしまいます。
さらに、ヘッダファイルで変数の実体を宣言してしまっているため二重定義になってしまっています。
まずヘッダファイルでの変数宣言を止めて、循環するようなインクルードをしないようにしてください。
Re: C++エラーLNK2005
Posted: 2012年3月21日(水) 21:05
by Rul
丁寧な解答ありがとうございます。
とりあえずやってみます。
Re: C++エラーLNK2005
Posted: 2012年3月21日(水) 22:02
by Rul
いろいろとやってみたのですが。
まずヘッダのインクルードはmain.hがすべてのヘッダを読み込みほかのヘッダではDxLib.h以外読み込まないように変更しました。
変数の実体の宣言をヘッダファイルの外でやるというのは、どういうことなのでしょうか。
私が考えていることをするとクラスである意味がなくなってしまうのではないかと思うのですが。
申し訳ないですがもう一度ご教授お願いいたします。
Re: C++エラーLNK2005
Posted: 2012年3月21日(水) 22:19
by h2so5
このコードはまだ途中ですから、
実際にPlayerを操作するコードを書くときにどのように記述するかを考えてみてください。
そして、*ch_t や *load_t といった変数は何のために宣言しているのでしょうか?
Re: C++エラーLNK2005
Posted: 2012年3月21日(水) 22:39
by Rul
はい、ありがとうございます!
*つきのものはエラーを何とかしようとした結果ついたものでした。
すいません。
助かりました。本当にありがとうございます。