通过命名空间共享值

时间:2015-03-30 18:31:13

标签: c++ string namespaces

我的问题可能很愚蠢,但我不能通过命名空间共享一个值。

namespace AceEngine
{
    namespace Graphics
    {
        namespace Interface
        {
            void drawDebugScreen()
            {
                // I want to access AceEngine::System::Version from here.
            }
        }
    }

    namespace System
    {
        string Version("DEBUG");
    }
}

如何访问此字符串?

编辑:

ae.cpp

#include "stdafx.h"
#include "sha256.h"
#include <iostream>
#include <string>
using std::cout;
using std::cin;
using std::endl;
using std::getline;
using std::string;

namespace AceEngine
{
    namespace Graphics
    {
        namespace Interface
        {
            void drawDebugScreen()
            {
                cout << "Version: " << AceEngine::System::Version << endl;
            }
            class Window{};
        }
    }
    namespace System
    {
        class User{};
        void pause(){cin.get();}
        extern string Version("DEBUG");
    }
}

ae.h

#pragma once
#include "stdafx.h"
#include <string>
using std::string;

namespace AceEngine
{
    namespace Graphics
    {
        namespace Interface
        {
            void drawDebugScreen();
            class Window{};
        }
    }

    namespace System
    {
        class User{};
        void pause();
        extern string Version;
    }
}

我删除了无用的部分(我留下了一些类来显示命名空间中的内容并且没有用处)

2 个答案:

答案 0 :(得分:1)

与往常一样,名称需要在使用前声明。

您可能希望在标头中声明它,因此可以在任何源文件中使用它。在声明全局变量时需要extern

namespace AceEngine {
    namespace System {
        extern string Version;
    }
}

或者,如果您只需要在此文件中使用它,您可以将System命名空间移动到任何需要它之前。

更新:现在您已发布完整代码,问题是源文件不包含标题。

答案 1 :(得分:0)

必须在其使用点之前放置字符串的声明。

#include <iostream>   //  for std::cout

namespace AceEngine
{
    namespace System
    {
        string Version("DEBUG");    // declare it here
    }

    namespace Graphics
    {
        namespace Interface
        {
            void drawDebugScreen()   // access it in here
            {
                std::cout << AceEngine::System::Version << '\n;
            }
        }
    }

}

int main()
{
     AceEngine::Graphics::Interface::drawDebugScreen();
     return 0;
}

如果你需要那么多嵌套命名空间,你可能会过度思考你的设计。但这是另一个故事。