我有一个类似于:
的global.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;
}
}
现在我不确定我是否可以在main.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;
}
基本上我得到了未解决的外部符号&#34;错误,我不知道如何解决它。感谢任何帮助!
编辑:虽然解决这个问题很难知道,但欢迎提出替代建议。我只想轻松(不是全局但我不介意)访问像对象这样的子系统。
答案 0 :(得分:3)
您应该从main()
中定义(初始化)它们(即在命名空间范围内),并且不要使用表示声明的extern
说明符。 e.g。
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()
{
...
}
答案 1 :(得分:3)
行
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文件中定义它们。在您的情况下,该文件应该是global.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>();
}
}