我有3个课程,分别是Board,Game和AI
我希望棋盘类的对象chessBoard可以被Game和AI使用,也可以被Board Class使用。我希望他们访问那个单一的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
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
答案 0 :(得分:4)
如果你真的想这样做,你需要在标题Board.h中声明对象extern
:
extern Board chessBoard;
然后您在Board.cpp中提供声明:
Board chessBoard;
更好的方法是,在封闭代码中创建它并将其(通过引用)传递给其他类的构造函数。
答案 1 :(得分: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
类的引用传递给所有需要的类,并将其保存在每个模式中object作为实例变量。类似的东西:
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
}
答案 2 :(得分: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);
}