共享具有多个类的对象

时间:2012-06-11 16:40:17

标签: c++

我有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

3 个答案:

答案 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);
}