2017-06-22 49 views
1

假設我有嵌套類:縮短成員函數作用域說明符(嵌套類)(C++)如下在頭文件中定義

class ClassA 
{ 
    private: 
    class ClassB 
    { 
     private: 
     int member_b; 
     public: 
     void function_name(); 
    }; 
}; 

爲了給定義函數「函數名()」中外部.cpp文件,我需要訪問它是這樣的:

void ClassA::ClassB::function_name() 
{ 
    std::cout << member_b; 
    return; 
} 

對於這個例子的目的,請不要問我爲什麼使用嵌套類;我有一個理由在我的實際項目中這樣做。不過,我的問題是這樣的; 是否有可能以某種方式將實現文件中的ClassA::ClassB::function_name()縮短爲像short::function_name()之類的東西,同時仍然保持類嵌套?我不認爲typedefs或新的命名空間定義可以幫助我,但也許我錯了。

+0

你確實可以在這裏使用typedef,看我的答案。希望能幫助到你。 –

+0

我應該提到,但ClassB仍然需要保持私密,如我的例子。除非ClassB是公開的,否則使用typedefs似乎不起作用,那麼還有其他方法可以實現嗎? – JohnTravolski

回答

1

限定的類型名稱允許你定義一個typedef來表示一個合格的類名。然後,可以使用該類型定義與::(範圍分辨率)操作來指代一個嵌套類或類成員,如下面的例子所示:

class outside 
{ 
public: 
     class nested 
     { 
     public: 
      static int x; 
      static int y; 
      int f(); 
      int g(); 
     }; 
}; 
int outside::nested::x = 5; 
int outside::nested::f() { return 0; }; 

typedef outside::nested outnest;  // define a typedef 
int outnest::y = 10;     // use typedef with :: 
int outnest::g() { return 0; }; 

然而,使用一個typedef來表示嵌套類名隱藏信息並可能使代碼更難理解。

來源:https://www.ibm.com/support/knowledgecenter/en/SSPSQF_9.0.0/com.ibm.xlcpp111.aix.doc/language_ref/cplr061.html

+0

這是有效的,但只有當嵌套類是公共的。這不是我最初考慮的事情,但是如果這個嵌套類是公開的,它是唯一可能的嗎?或者,如果它是私人/受保護的,那麼這仍然可以通過其他方式完成,就像我的例子那樣? – JohnTravolski

+0

你是對的,它只有在嵌套類是公共的時候纔有效。 –

+0

那麼有沒有什麼辦法可以實現當嵌套類是私人的時候我在尋找什麼?我只是想縮短實現文件中每個函數定義的長名稱。 – JohnTravolski

0

您是否嘗試過使用別名?

// C++11 
using fmtfl = std::ios_base::fmtflags; 
// C++03 equivalent: 
// typedef std::ios_base::fmtflags fmtfl; 

fmtfl fl_orig = std::cout.flags(); 
fmtfl fl_hex = (fl_orig & ~std::cout.basefield) | std::cout.showbase | std::cout.hex; 
// ... 
std::cout.flags(fl_hex); 

代碼源:https://msdn.microsoft.com/en-us/library/dn467695.aspx

+0

我不相信這會工作,因爲嵌套類是私人的。或者我錯了? – JohnTravolski