C++エラーLNK2005

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

C++エラーLNK2005

#1

投稿記事 by Rul » 14年前

[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

よろしくお願いいたします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: C++エラーLNK2005

#2

投稿記事 by h2so5 » 14年前

どこかで二重に定義してる部分があるというエラーです。
ソースコードを投稿してもらったほうが早いと思います。

Rul

Re: C++エラーLNK2005

#3

投稿記事 by Rul » 14年前

コード:

//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

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: C++エラーLNK2005

#4

投稿記事 by h2so5 » 14年前

main.h と main.cpp のソースはどうなっていますか?

Rul

Re: C++エラーLNK2005

#5

投稿記事 by Rul » 14年前

コード:

//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;
} 


Rul

Re: C++エラーLNK2005

#6

投稿記事 by Rul » 14年前

これで大丈夫でしょうか?

淡白な質問分で申し訳ないです。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: C++エラーLNK2005

#7

投稿記事 by h2so5 » 14年前

ファイル分割の仕方に問題があります。

各ヘッダファイルでmain.hをインクルードしていますが、
main.hでその各ヘッダファイルをインクルードしているため循環してヘッダファイルが何度もインクルードされてしまいます。

さらに、ヘッダファイルで変数の実体を宣言してしまっているため二重定義になってしまっています。
まずヘッダファイルでの変数宣言を止めて、循環するようなインクルードをしないようにしてください。

Rul

Re: C++エラーLNK2005

#8

投稿記事 by Rul » 14年前

丁寧な解答ありがとうございます。
とりあえずやってみます。

Rul

Re: C++エラーLNK2005

#9

投稿記事 by Rul » 14年前

いろいろとやってみたのですが。
まずヘッダのインクルードはmain.hがすべてのヘッダを読み込みほかのヘッダではDxLib.h以外読み込まないように変更しました。
変数の実体の宣言をヘッダファイルの外でやるというのは、どういうことなのでしょうか。

私が考えていることをするとクラスである意味がなくなってしまうのではないかと思うのですが。

申し訳ないですがもう一度ご教授お願いいたします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: C++エラーLNK2005

#10

投稿記事 by h2so5 » 14年前

このコードはまだ途中ですから、
実際にPlayerを操作するコードを書くときにどのように記述するかを考えてみてください。

そして、*ch_t や *load_t といった変数は何のために宣言しているのでしょうか?

Rul

Re: C++エラーLNK2005

#11

投稿記事 by Rul » 14年前

はい、ありがとうございます!

*つきのものはエラーを何とかしようとした結果ついたものでした。
すいません。

助かりました。本当にありがとうございます。

閉鎖

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