(C ++) Связывание с пространствами имен вызывает ошибку дублирования символов

Последние несколько дней я пытался придумать, как связать файлы для игрового проекта CLI, над которым я работал. Есть две половины проекта, клиентский и серверный код.

Клиенту нужны две библиотеки, которые я сделал. Первая - это игровая доска общего назначения. Он разделен между GameEngine.h и GameEngine.cpp. Заголовочный файл выглядит примерно так

namespace gfdGaming {

//  struct sqr_size {
//      Index x;
//      Index y;
//  };
    typedef struct { Index x, y; } sqr_size; 
    const sqr_size sPos = {1, 1};
    sqr_size sqr(Index x, Index y);
    sqr_size ePos;
    class board
    {
    // Prototypes / declarations for the class
    }
}

А файл CPP просто передает все содержимое

#include "GameEngine.h"

type gfdGaming::board::functions

У клиента также есть код игры (в данном случае TicTacToe), разделенный на объявления и определения (TTT.h, Client.cpp ). TTT.h в основном

#include "GameEngine.h"

#define TTTtar "localhost"
#define TTTport 2886

using namespace gfdGaming;
void* turnHandler(void*);
namespace nsTicTacToe 
{
    GFDCON gfd;
    const char X = 'X';
    const char O = 'O';
    string MPhostname, mySID;
    board TTTboard;
    bool PlayerIsX = true, isMyTurn;
    char Player = X, Player2 = O;

    int recon(string* datHolder = NULL, bool force = false);
    void initMP(bool create = false, string hn = TTTtar);
    void init();
    bool isTie();
    int turnPlayer(Index loc, char lSym = Player);
    bool checkWin(char sym = Player);

    int mainloop();

    int mainloopMP();

}; // NS

. Я решил поместить его в пространство имен, чтобы сгруппировать его вместо класса, потому что есть некоторые части, которые не будут хорошо работать в ООП, и их намного проще реализовать позже.

В прошлом у меня были проблемы с подключением клиента, но эта настройка, похоже, работает.

Мой сервер также разделен на два файла, Server.h и Server.cpp.

Server.h содержит в точности:

#include "../TicTacToe/TTT.h" // Server needs a full copy of TicTacToe code

class TTTserv;
struct TTTachievement_requirement {
    Index id;
    Index loc;
    bool inUse;
};
struct TTTachievement_t {
    Index id;
    bool achieved;
    bool AND, inSameGame;
    bool inUse;
    bool (*lHandler)(TTTserv*);
    char mustBeSym;
    int mustBePlayer;
    string name, description;
    TTTachievement_requirement steps[safearray(8*8)];

};

class achievement_core_t : public GfdOogleTech {
public: // May be shifted to private
    TTTachievement_t list[safearray(8*8)];
public:
    achievement_core_t();

    int insert(string name, string d, bool samegame, bool lAnd, int lSteps[8*8], int mbP=0, char mbS=0);
};


struct TTTplayer_t {
    Index id;
    bool inUse;
    string ip, sessionID;
    char sym;
    int desc;
    TTTachievement_t Ding[8*8];
};
struct TTTgame_t {
    TTTplayer_t Player[safearray(2)];
    TTTplayer_t Spectator;
    achievement_core_t achievement_core;
    Index cTurn, players;
    port_t roomLoc;
    bool inGame, Xused, Oused, newEvent;
};


class TTTserv : public gSserver {
    TTTgame_t Game;
    TTTplayer_t *cPlayer;

    port_t conPort;
public:
    achievement_core_t *achiev;
    thread threads[8];
    int parseit(string tDat, string tsIP);
    Index conCount;
    int parseit(string tDat, int tlUser, TTTplayer_t** retval);

private:
    int parseProto(string dat, string sIP);
    int parseProto(string dat, int lUser);

    int cycleTurn();
    void setup(port_t lPort = 0, bool complete = false);

public:
    int newEvent;
    TTTserv(port_t tlPort = TTTport, bool tcomplete = true);

    TTTplayer_t* userDC(Index id, Index force = false);
    int sendToPlayers(string dat, bool asMSG = false);
    int mainLoop(volatile bool *play);
};



// Other 
void* userHandler(void*);
void* handleUser(void*);

И в файл CPP я включаю Сервер. У меня возникают проблемы при связывании моего сервера. В частности, я получаю ошибку повторяющегося символа для каждой переменной в nsTicTacToe (и, возможно, также в gfdGaming). Поскольку мне нужны функции TicTacToe, я связываю Client.cpp (без main ()) при сборке сервера

ld: duplicate symbol nsTicTacToe::PlayerIsX       in Client.o and Server.o
collect2: ld returned 1 exit status
Command /Developer/usr/bin/g++-4.2 failed with exit code 1

It stops once a problem is encountered, but if PlayerIsX is removed / changed temporarily than another variable causes an error

По сути, я ищу любые советы о том, как лучше организовать свой код, чтобы, надеюсь, исправить эти ошибки.

Отказ от ответственности. : -Я заранее прошу прощения, если я предоставил слишком много или слишком мало информации, так как это моя первая публикация

-Я пробовал использовать static и extern, чтобы исправить эти проблемы, но, видимо, это не то, что мне нужно

Спасибо вы всем, кто найдет время, чтобы прочитать все это и ответить =)

5
задан Gfdking 15 January 2011 в 22:47
поделиться