如何在命名空间中初始化外部变量



我有一个全局.h,看起来像:

#pragma once
#include <memory>
namespace qe
{
class SubSystemA;
class SubSystemB;
class SubSystemC;
namespace Systems
{
extern std::unique_ptr<SubSystemA> gSubSystemA;
extern std::unique_ptr<SubSystemB> gSubSystemB;
extern std::unique_ptr<SubSystemC> gSubSystemC;
}
}

现在我不确定我是否可以在我的主文件中初始化它.cpp但是我正在做,它不起作用......请指教。以下是主要内容:

#include "SubSystemA.h"
#include "SubSystemB.h"
#include "SubSystemC.h"
#include "global.h"
int main()
{
extern std::unique_ptr<qe::SubSystemA> qe::Systems::gSubSystemA;
extern std::unique_ptr<qe::SubSystemB> qe::Systems::gSubSystemB;
extern std::unique_ptr<qe::SubSystemC> qe::Systems::gSubSystemC;
qe::Systems::gSubSystemA = std::make_unique<qe::SubSystemA>();
qe::Systems::gSubSystemB = std::make_unique<qe::SubSystemB>();
qe::Systems::gSubSystemC = std::make_unique<qe::SubSystemC>();
return 0;
}

基本上我收到"未解析的外部符号"错误,我不确定如何解决它。任何帮助都非常感谢!

编辑:虽然解决这个问题很高兴知道,但欢迎有关执行此操作的替代建议。我只是想轻松(并不意味着全局,但我不介意(访问对象等子系统。

您应该在main()之外(即在命名空间范围内(定义(初始化(它们,并且不要使用extern说明符,它表示声明。

例如
std::unique_ptr<qe::SubSystemA> qe::Systems::gSubSystemA = std::make_unique<qe::SubSystemA>();
std::unique_ptr<qe::SubSystemB> qe::Systems::gSubSystemB = std::make_unique<qe::SubSystemB>();
std::unique_ptr<qe::SubSystemC> qe::Systems::gSubSystemC = std::make_unique<qe::SubSystemC>();
int main()
{
...
}

qe::Systems::gSubSystemA = std::make_unique<qe::SubSystemA>();
qe::Systems::gSubSystemB = std::make_unique<qe::SubSystemB>();
qe::Systems::gSubSystemC = std::make_unique<qe::SubSystemC>();

main中不要定义变量。它们为变量赋值。它们需要在所有函数之外定义。最好在与声明它们的 .h 文件相对应的.cpp文件中定义它们。在您的情况下,该文件应该是全局的.cpp。在所有命名空间之外添加以下行。

qe::Systems::gSubSystemA = std::make_unique<qe::SubSystemA>();
qe::Systems::gSubSystemB = std::make_unique<qe::SubSystemB>();
qe::Systems::gSubSystemC = std::make_unique<qe::SubSystemC>();

您还可以使用:

namespace qe
{
namespace Systems
{
gSubSystemA = std::make_unique<SubSystemA>();
gSubSystemB = std::make_unique<SubSystemB>();
gSubSystemC = std::make_unique<SubSystemC>();
}
}

或在 C++17 中:

namespace qe::Systems
{
gSubSystemA = std::make_unique<SubSystemA>();
gSubSystemB = std::make_unique<SubSystemB>();
gSubSystemC = std::make_unique<SubSystemC>();
}

最新更新