c++命名空间与类
Posted
技术标签:
【中文标题】c++命名空间与类【英文标题】:c++ namespace with class 【发布时间】:2012-06-18 21:46:58 【问题描述】:ns.cpp
:
#include <iostream>
namespace ns // want to access this globally
class A ;
class ns::A
public:
int x1;
char s1[128];
;
int main()
int doit();
//using namespace ns;
ns::A a;
a.x1= 2;
std::cout << "pre " << a.x1 << "\n" ;
doit();
std::cout << "post " << a.x1 << "\n" ;
ns_call.cpp
:
namespace ns
class A;
class ns::A
public:
int x1;
char s1[];
;
using namespace ns;
int
doit()
extern ns::A a;
a.x1= 100;
在 ns.cpp 中,在命名空间中声明了一个类。 类定义如下。
类中的变量可以全局访问。这 是命名空间的目标。
ns_call.cpp 然后访问该类成员的 1,x1。
这两个文件在 Fedora 14 中使用 gcc 5.4.1 编译成功。 运行输出为:
pre 2
post 2
我期待“发布 100”,因为我想访问 A 类中的 int x1 全球。
【问题讨论】:
这没有链接:undefined reference to 'a'
(它在main
中声明,不是全局的)。
这违反了 ODR——ns_capp.cpp 中ns::A
的定义与 ns.cpp 中的不同。
移动“ns::A a;”最多 6 行。然后就可以了。
【参考方案1】:
extern
、namespace
s 或前向声明似乎都不是您认为的意思。
如果您想引入一个可以访问我的多个翻译单元的名称(当您说“全局”时,您的意思似乎是),您可以将这些定义放在一个头文件中,然后 #include
该头文件来自您的任何位置想用。
您实际上在做的是在每个翻译单元(例如,在每个 CPP 文件中)一遍又一遍地引入class A
。这充其量只是违反了 ODR。
【讨论】:
【参考方案2】:我只是要帮助您解决问题,而您绝对必须注意有关 ODR(一个定义规则)的其他答案并修复您的设计。
在ns.cpp
文件中,您必须将ns::A a;
行移出main()
函数。将其放在文件范围内(例如,就在main
之前。)另外,在ns_call.cpp
文件中,将extern ns::A a;
行也移出函数。
注意:您可能需要也可能不需要执行第二部分,整个方法可能有效,也可能无效。我现在无法访问编译器。
我不得不再次同意其他 cmet 的观点,即这种设计存在缺陷,它会让你头疼。
【讨论】:
以上是关于c++命名空间与类的主要内容,如果未能解决你的问题,请参考以下文章