命名空间 C++ 中的外部变量
extern variable in namespace c++
我对命名空间 c++ 中的外部变量有疑问。这是 CBVR class
的 .h 文件
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;
处理它,但我不明白它的含义以及为什么它允许在 class?
中像这样使用 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;
}
}
那有什么区别呢?
在成员函数的定义中,您处于 class 的范围内,后者又在其周围命名空间的范围内。因此,在 class 或命名空间中声明的任何内容都可以在那里无限制地访问。
在命名空间之外,非限定名称不可用,这就是为什么您需要在变量和函数定义中使用 parameters::
限定。
拥有
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)
{
... }
}
class 在命名空间的范围内,因此您正在实现的 class 的主体也在该范围内。
我对命名空间 c++ 中的外部变量有疑问。这是 CBVR class
的 .h 文件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;
处理它,但我不明白它的含义以及为什么它允许在 class?
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;
}
}
那有什么区别呢?
在成员函数的定义中,您处于 class 的范围内,后者又在其周围命名空间的范围内。因此,在 class 或命名空间中声明的任何内容都可以在那里无限制地访问。
在命名空间之外,非限定名称不可用,这就是为什么您需要在变量和函数定义中使用 parameters::
限定。
拥有
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)
{
... }
}
class 在命名空间的范围内,因此您正在实现的 class 的主体也在该范围内。