2015-03-30 2 views
0

Мой вопрос, вероятно, глупо, но я не могу поделиться значением через пространства имен.Обмен значениями через пространства имен

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

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

Как я могу получить доступ к этой строке?

EDIT:

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; 
    } 
} 

я удалил ненужные части (я оставил некоторые классы, чтобы показать, есть вещи в пространствах имен, и это не бесполезно)

+0

Какое сообщение об ошибке? – immibis

ответ

1

Как всегда, имена должны быть объявлены перед использованием.

Возможно, вы захотите объявить его в заголовке, поэтому его можно использовать из любого исходного файла. Вам нужно extern при объявлении глобальной переменной:

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

Или, если вам это нужно только в этом файле, можно просто переместить System пространство имен прийти прежде, чем все, что нужно.

UPDATE: теперь вы отправили полный код, проблема в том, что исходный файл не содержит заголовок.

+0

У меня уже есть файл заголовка; и строка уже объявлена. Я попытался получить доступ к «extern string Version», используя «AceEngine :: System :: Version», но не объявлен для компилятора. –

+0

@ K-WARE: В этом случае, пожалуйста, обновите вопрос, чтобы показать, что вы пытались и как оно не работает. В коде, который вы опубликовали, единственная проблема заключается в том, что он не объявлен в этот момент. Если компилятор говорит, что он не объявлен, то почти наверняка это не так. –

+0

@ K-WARE: У вас есть заголовок, но вы его не включаете; поэтому строка не объявлена. –

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; 
} 

Если вам нужно такое количество вложенных пространств имен, вы, вероятно, думаете о своем дизайне. Но это уже другая история.

Смежные вопросы