Я довольно новичок в C ++ и не могу понять, как объявлять переменные, существующие в области действия всего приложения.
Итак, я объявляю массив extern
, а затем делегирую егоинициализация в соответствующий файл cpp
(trigonometry.cpp
). Следуя логике, когда я вызываю эту функцию инициализации, эти внешние массивы должны существовать везде и иметь значения. Но, очевидно, это не то, что происходит.
Ниже приведен соответствующий код.
Вывод ошибки:
player.o: In function `Player::yDirection() const':
player.cpp:(.text+0x97): undefined reference to `Trigonometry::fSinTable'
Заголовочный файл, в котором я объявляю переменную extern.
// trigonometry.hpp
namespace Trigonometry
{
extern double fSinTable[Config::ANGLE360 + 1];
bool load();
}; // namespace Trigonometry
Функция, в которой я init значения fSinTable
// trigonometry.cpp
bool Trigonometry::load()
{
for (int i = 0; i != (Config::ANGLE360 + 1); ++i)
{
double radian = arcToRad(i) + (0.0001); // Add 0.0001 to avoid division by zero
double fSinTable[i] = {std::sin(radian)};
}
return 0;
}
Класс, в котором я пытаюсь получить доступ к массиву
// player.cpp
#include "trigonometry.hpp"
#include "player.hpp"
const double &Player::yDirection() const
{
return Trigonometry::fSinTable[_rotation];
}
И мой основной класс, где я пытаюсь вызвать функцию инициализации перед всем остальным.
// main.cpp
#include "config.hpp"
#include "trigonometry.hpp"
#include "player.hpp"
// ...
// This executes before &Player::yDirection(), so I would expect Trigonometry::fSinTable to be initialized
bool loaded = Trigonometry::load();
Player *player;
int main(int argc, char *argv[])
{
player = new Player();
}
Редактировать:
Вот как япостроить приложение:
g++ -c -o trigonometry.o trigonometry.cpp
g++ -c -o player.o player.cpp
g++ -c -o main.o main.cpp
g++ -o App trigonometry.o player.o main.o