带有类的c ++命名空间

时间:2012-06-18 21:46:59

标签: c++ class namespaces

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访问类'member,x1。

中的1个

使用Fedora 14中的gcc 5.4.1编译了2个文件。 运行输出是:

pre 2
post 2

我预计'发布100'因为我想在A类中访问int x1 全局。

2 个答案:

答案 0 :(得分:3)

externnamespace或前瞻性声明似乎都不代表您认为的含义。

如果你想引入一个可以访问我的多个翻译单元的名称(当你说“全局”时你的意思),你可以将这些定义放在一个头文件中,#include标题来自无论你想在哪里使用它。

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

答案 1 :(得分:1)

我只是帮你修复你的问题,而你绝对必须听取有关ODR(一个定义规则)的其他答案并修复你的设计。

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

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

我再次赞同其他评论,认为这种设计存在缺陷, 会让您感到头疼。