簡體   English   中英

具有類的c ++命名空間

[英]c++ namespace with class

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

我期望“ post 100”,因為我想全局訪問A類的int x1。

externnamespace或forward聲明似乎都不表示您認為的含義。

如果您想引入一個可以在多個翻譯單元中使用的名稱(當您說“全局”時,這似乎意味着什么),則可以將這些定義放在頭文件中,並在要使用的任何位置#include該頭。

您實際上正在做的是在每個翻譯單元中(例如,在每個CPP文件中)一次又一次地引入class A 這充其量是對ODR的違反。

我只是想幫助您解決問題,而您絕對必須注意有關ODR(一個定義規則)的其他答案並修正您的設計。

ns.cpp文件中,您必須移動ns::A a;ns::A a; main()函數之外。 將其放在文件范圍內(例如, ns_call.cppmain之前。)此外,在ns_call.cpp文件中,將extern ns::A a;行移到該位置extern ns::A a; 超出功能范圍。

注意:您可能必須做第二部分,也可能不必,第二部分可能也不行。 我現在無權使用編譯器。

同樣,我必須同意其他評論,認為該設計存在缺陷, 引起您的頭痛。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM