2015-02-09 8 views
0

У меня вопрос о переменной extern в пространстве имен C++. Вот .h файл класса CBVRВнешняя переменная в пространстве имен C++

namespace parameters 
{ 
class CBVR 
{ 
private: 

    std::string database; 

public: 

    CBVR(void); 

    void initialize(const std::string &fileName); 
    static void printParameter(const std::string &name, 
           const std::string &value); 
}; 
extern CBVR cbvr; 
} 

Файл .cpp выглядит следующим образом:

parameters::CBVR parameters::cbvr; 


using namespace xercesc; 

parameters::CBVR::CBVR(void) 
{ 

} 

void parameters::CBVR::initialize(const std::string &_fileName) 
{ 

} 

void parameters::CBVR::printParameter(const std::string &_name, const std::string &_value) 
{ 
    if (_value.empty()) 
    { 
     cbvr << " -> " << _name << " = < EMPTY!!! >" << std::endl; 
    } 
    else 
    { 
     cbvr << " -> " << _name << " = \"" << _value << "\"" << std::endl; 
    } 
} 

В методе printParameter мы используем cbvr без каких-либо ссылок на пространство имен. parameters::CBVR parameters::cbvr; обрабатывает его, но я не понимаю, что это значит и почему он позволяет использовать переменную cbvr, как это в классе?

Редакция:

Я сделал это, но он говорит: error: undefined reference to parameters::cbvr

//parameters::CBVR parameters::cbvr; 
using namespace parameters; 
using namespace xercesc; 

CBVR::CBVR(void) 
{ 

} 

void CBVR::initialize(const std::string &_fileName) 
{ 

} 

void CBVR::printParameter(const std::string &_name, const std::string &_value) 
{ 
    if (_value.empty()) 
    { 
     cbvr << " -> " << _name << " = < EMPTY!!! >" << std::endl; 
    } 
    else 
    { 
     cbvr << " -> " << _name << " = \"" << _value << "\"" << std::endl; 
    } 
} 

так какая разница?

ответ

3

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

Вне пространства имен неквалифицированные имена недоступны, поэтому для определения переменных и функций требуется квалификация parameters::.

+0

@Edited вопрос. – Maystro

+1

@Maystro: Вы прокомментировали определение 'cvbr', поэтому компоновщик жаловался, что он не определен. Почему ты бы так поступил? –

+0

Я просто хочу понять разницу и то, что она делает именно «параметры :: CBVR parameters :: cbvr»? вы сказали определение? он уже был определен в пространстве имен, не был? – Maystro

1

Имея

void parameters::CBVR::printParameter(const std::string &_name, const std::string &_value) 
{ 
    ... } 

такого же как

namespace parameters 
{// notice, the signature of the method has no "parameters" before CBVR 
    void CBVR::printParameter(const std::string &_name, const std::string &_value) 
    { 
     ... } 
} 

Класса находится в области видимости пространства имен, так что тело класса вы реализующий в объеме, а также.