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】:

externnamespaces 或前向声明似乎都不是您认为的意思。

如果您想引入一个可以访问我的多个翻译单元的名称(当您说“全局”时,您的意思似乎是),您可以将这些定义放在一个头文件中,然后 #include 该头文件来自您的任何位置想用。

您实际上在做的是在每个翻译单元(例如,在每个 CPP 文件中)一遍又一遍地引入class A。这充其量只是违反了 ODR。

【讨论】:

【参考方案2】:

我只是要帮助您解决问题,而您绝对必须注意有关 ODR(一个定义规则)的其他答案并修复您的设计。

ns.cpp 文件中,您必须将ns::A a; 行移出main() 函数。将其放在文件范围内(例如,就在main 之前。)另外,在ns_call.cpp 文件中,将extern ns::A a; 行也移出函数。

注意:您可能需要也可能不需要执行第二部分,整个方法可能有效,也可能无效。我现在无法访问编译器。

我不得不再次同意其他 cmet 的观点,即这种设计存在缺陷,它让你头疼。

【讨论】:

以上是关于c++命名空间与类的主要内容,如果未能解决你的问题,请参考以下文章

C#命名空间与类和方法的认识

命名空间内与类内的范围函数[重复]

命名空间

C++问题:关于匿名命名空间

C++ 项目相关知识命名空间

如何从嵌套命名空间中引用外部 C++ 命名空间?