ilikeyou
ilikeyou

Reputation: 33

sharing an object with multiple classes

I have 3 classes namely Board, Game, and AI

i want to have the object chessBoard of Board class to be use by Game and AI, and also by the Board Class. I want them to access that single chessBoard object (sharing)

problem is, it gives me the infamous fatal error LNK1169: one or more multiply defined symbols found. Also, there are Board.h,Game.h and AI.h (only declarations in them), and i also have their corresponding .cpp files. Each .h files have guards included (#ifndef _XXXXXX_H_)

I tried to include Board chessBoard inside Board.h file (just below the class), and it seems guards are not working.

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

Upvotes: 2

Views: 7277

Answers (3)

PermanentGuest
PermanentGuest

Reputation: 5331

Your problem could be that there could be 3 different chessBoard definitions because you might be adding 3 different #include "Board.h". Please make only a single object at a place where you have more control rather than creating it globally inside Board.h

Did you try it like this? Include the necessary include declarations only in the .cpp files.

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

Upvotes: 0

Jack
Jack

Reputation: 133557

What you are looking for is the Singleton design pattern which can achieved in the following way:

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

Mind that this pattern can either be seen as good or bad, if you don't like using it you should consider passing the reference of an instantiated Board class to all the requiring ones and keep it stored in each object as an instance variable. Something like:

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
}

Upvotes: 2

ecatmur
ecatmur

Reputation: 157314

If you really want to do this, you need to make the declaration of the object extern in the header Board.h:

extern Board chessBoard;

You then provide a declaration in Board.cpp:

Board chessBoard;

Much better, though would be to create it in enclosing code and pass it (by reference) to the constructors of the other classes.

Upvotes: 4

Related Questions