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

时间:2017-07-18 03:10:48

标签: c++ initialization extern

我有一个类似于:

的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;错误,我不知道如何解决它。感谢任何帮助!

编辑:虽然解决这个问题很难知道,但欢迎提出替代建议。我只想轻松(不是全局但我不介意)访问像对象这样的子系统。

2 个答案:

答案 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>();
   }
}