我对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输入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发布于 2019-10-08 17:25:52
我发现我的错误并没有在任何地方定义fSinTable。
我错误地定义了数组的每个子数组,而不是整个数组。
因此,从这一点来看:
// trigonometry.cpp
#include "trigonometry.hpp"
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;
}对此:
// trigonometry.cpp
#include "trigonometry.hpp"
double Trigonometry::fSinTable[Config::ANGLE360 + 1];
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
fSinTable[i] = std::sin(radian);
}
return true;
}https://stackoverflow.com/questions/58290807
复制相似问题