带有类的 C++ 命名空间

c++ namespace with class

本文关键字:C++ 命名空间      更新时间:2023-10-16

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访问类成员 x1 的 1

这 2 个文件在 Fedora 14 中使用 gcc 5.4.1 编译正常。运行输出为:

pre 2
post 2

我期望"后 100",因为我想在 A 类中访问 int x1全球。

externnamespace s 或前向声明似乎都没有你认为它们的意思。

如果你想引入一个可以访问我的多个翻译单元的名称(当你说"全局"时,你的意思似乎是),你把这些定义放在一个头文件中,并从你想使用它的地方#include那个头。

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

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

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

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

再次,我必须同意其他评论,即这种设计存在缺陷,让您头疼。