2

我有 3 个课程,即棋盘、游戏和 AI

我想让棋盘类的对象 chessBoard 供游戏和 AI 以及棋盘类使用。我希望他们访问那个单一的 chessBoard 对象(共享)

问题是,它给了我臭名昭著的致命错误 LNK1169:找到了一个或多个多重定义的符号。此外,还有 Board.h、Game.h 和 AI.h(其中只有声明),我也有它们对应的 .cpp 文件。每个 .h 文件都包含保护 (#ifndef _XXXXXX_H_)

我试图将 Board chessBoard 包含在 Board.h 文件中(就在班级下方),但似乎警卫不起作用。

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

人工智能.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

游戏.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

板子.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

您正在寻找的是可以通过以下方式实现的Singleton设计模式:

// 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 个不同的 chessBoard 定义,因为您可能要添加 3 个不同的 #include "Board.h"。请在您拥有更多控制权的地方只创建一个对象,而不是在 Board.h 中全局创建它

你试过这样吗?仅在 .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 回答