2

ボード、ゲーム、AIの3つのクラスがあります

ゲームとAI、およびボードクラスで使用できるボードクラスのオブジェクトchessBoardが必要です。その単一のチェス盤オブジェクトにアクセスしてもらいたい(共有)

問題は、悪名高い致命的なエラーLNK1169が発生することです。1つ以上の複数定義されたシンボルが見つかりました。また、Board.h、Game.h、AI.h(宣言のみ)があり、対応する.cppファイルもあります。各.hファイルにはガードが含まれています(#ifndef _XXXXXX_H_)

Board.hファイル(クラスのすぐ下)にBoard chessBoardを含めようとしましたが、ガードが機能していないようです。

Error   7   error LNK2005: "class Board chessBoard" (?chessBoard@@3VBoard@@A)     already defined in AI.obj C:\Users\xxxx\Documents\Visual Studio 2010\Projects\CHESSv3\CHESSv3\Board.obj   CHESSv3
Error   8   error LNK2005: "class Board chessBoard" (?chessBoard@@3VBoard@@A)     already defined in AI.obj C:\Users\xxxxx\Documents\Visual Studio 2010\Projects\CHESSv3\CHESSv3\Game.obj   CHESSv3
Error   9   error LNK2005: "class Board chessBoard" (?chessBoard@@3VBoard@@A) already defined in AI.obj C:\Users\xxxxx\Documents\Visual Studio 2010\Projects\CHESSv3\CHESSv3\ProgramEntryPoint.obj  CHESSv3

AI.h

#ifndef _AI_H_
#define _AI_H_
#include <iostream>
#include <string>
using namespace std;

struct node {
    string position;
    string nextPosition;
    float score;
    int level;
    float totalscore;
    node* up;
    node* right;
    node* left;
    bool approved;
    string move;
};

class AI {
private:
    //string board;
    //string board[8][8];
    int score1;
    int maxscore;
    int totalscore;
public: 
    void GetBoard(string[][8]);
    void AnalyzeMyPositions();
    void ExecuteAdvanceHeuristicMove();
};

#endif

Game.h

#ifndef _GAME_H_
#define _GAME_H_

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <queue>
#include <stack>
#include <cmath>

using namespace std;

class Game {
public:
    char WhosTurn();
    bool Playable();
    bool GetMoveFromPlayer();
    void TurnOver();
    Game();
private:
    char turn;
};

#endif

Board.h

#ifndef _BOARD_H_
#define _BOARD_H_
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <queue>
#include <stack>
#include <cmath>
using namespace std;

class Board {
public:
    bool SquareChecker(string);
    bool MoveChecker(string);
    Board();
    void PrintBoard();
    int Execute(string);
    void UnExecute();
    string CB[8][8];
private:
    char turn;
    vector<string> BoardRecord;
    stack<string> CBR;
    //string CB[8][8];
};

Board chessBoard;

#endif
4

3 に答える 3

4

本当にこれを実行したい場合externは、ヘッダーBoard.hでオブジェクトの宣言を行う必要があります。

extern Board chessBoard;

次に、Board.cppで宣言を提供します。

Board chessBoard;

ただし、コードを囲んで作成し、(参照によって)他のクラスのコンストラクターに渡す方がはるかに優れています。

于 2012-06-11T16:44:21.163 に答える
2

探しているのは、次の方法で実現できるシングルトンデザインパターンです。

// Board.h
class Board {
  private:
    static instance_;

  public:
    static Board *instance();
}

// Board.cpp

Board *Board::instance_ = NULL;

Board *Board::instance() {
  if (!instance_)
    instance_ = new Board();

  return instance_;
}

このパターンは良いか悪いかのどちらかと見なされる可能性があることに注意してください。使用したくない場合は、インスタンス化されたクラスの参照をBoard必要なすべてのクラスに渡し、インスタンス変数として各オブジェクトに格納することを検討する必要があります。何かのようなもの:

Game::Game() {
  this->board = new Board();
  this->ai = new AI(board);
  // or better this->ai = new AI(this) so AI can access all game methods
}
于 2012-06-11T16:46:00.753 に答える
0

問題は、3つの異なる#include "Board.h"を追加している可能性があるため、3つの異なるchessBoard定義が存在する可能性があることです。Board.h内でグローバルに作成するのではなく、より詳細に制御できる場所で1つのオブジェクトのみを作成してください。

このようにやってみましたか?必要なインクルード宣言は、.cppファイルにのみインクルードしてください。

//Board.h

class Board {};

//Game.h

class Board;
class Game {
    Board* myBoard;

public:
    void setBoard(Board*);
};

//AI.h
class Board;
class AI {
    Board* myBoard;

public:
    void setBoard(Board*);
};

void main() {
    Board chessBoard;
    Game g;
    g.setBoard(&chessBoard);

    AI ai;
    ai.setBoard(&chessBoard);
}
于 2012-06-11T16:45:56.487 に答える