Как сделать содержимое пространства имен доступным для всего проекта, не генерируя ошибок Multiply Defined Symbol? - PullRequest
1 голос
/ 22 сентября 2011

Я пытаюсь создать довольно большую видеоигру, и мой текущий метод обработки ввода с мыши - передать mouseX, mouseY и enum mouseState в качестве аргументов функции обновления КАЖДОГО отдельного объекта, который требует знания мыши. Это довольно грязно, и я хочу сделать переменные мыши более глобальными, поместив их в пространство имен с именем Input, чтобы я мог получить к ним доступ с помощью Input :: mouseX и др.

В нынешнем виде пространство имен Input существует в Input.h (содержимое ниже)

#pragma once
#include "allegro5\allegro.h"
#include "J_Enum.h"
namespace Input{
ALLEGRO_EVENT_QUEUE *inputQueue;
int mouseX;
int mouseY;
MOUSE_STATE mouseState;
void setUpInput();
void updateInput();
};

и две функции-члена определены в Input.cpp

#include "Input.h"

void Input::setUpInput(){...declaration
void Input::updateInput(){...''

После включения Input.h в заголовок объекта основного цикла Core.h компоновщик генерирует шипение, потому что в его глазах все, что включено в Input.h, теперь является символом с многократным определением. Очевидно, что что-то не так с моим использованием файлов заголовков, потому что, насколько я знаю, я не допустил каких-либо явных ошибок при использовании пространств имен, а префикс кода ошибки LNK2005, похоже, подразумевает компоновщик (?).

Если кто-нибудь сможет пролить свет на мою дилемму, я был бы очень признателен

1 Ответ

2 голосов
/ 22 сентября 2011

Объявите переменные как extern:

// header file:
namespace Input {
  extern int mouseX;
}

// implementation
#include "input.h"
namespace Input {
  int mouseX;
}
...