2010-10-04 61 views
2

我的問題是你真的在你的練習中使用嵌套類多久?嵌套類的真正威力是什麼?沒有它們,什麼是不可能完成的? P.S.請不要解釋它是什麼,我知道它(from technical point of view在C++中的嵌套類

回答

6

我通常使用嵌套類嵌入發現者對象(與std::find_if使用)到我的具體類型。

喜歡的東西:

// Dummy example 
class Foo 
{ 
    public: 
    class finder 
    { 
     public: 

     finder(int value) : m_value(value) {}; 

     bool operator()(const Foo& foo) { return (foo.m_int_value == value); } 

     private: 

     int m_value; 
    }; 

    private: 

    int m_int_value; 

    friend class finder; 
}; 

然後:

vector<Foo> foo_list; 
vector<Foo>::iterator foo = 
    std::find_if(foo_list.begin(), foo_list.end(), Foo::finder(4)); 

這當然可以在不使用嵌套類來完成。但我覺得它很優雅,因爲取景器在類定義之外沒有用處:

如果我在代碼重構的情況下刪除了類,查找器也應該被刪除。

+2

@Yogesh:'Foo :: finder'也是一個函數對象。對於更復雜的測試,這可以比'boost :: bind'或類似的更具可讀性。 – 2010-10-04 13:15:08

+0

@Yogesh Arora:這當然是一個簡化的例子,我自己使用'boost :: find'和'std :: mem_fun'很多。但是對於一些複雜的情況,我相信使用查找器對象會使我的代碼更易於閱讀和維護。我理解你的觀點,但我的答案是否真的值得投票?這不是我所說的根本錯誤。 – ereOn 2010-10-04 13:35:07

+0

我沒有看到爲什麼這些必須是嵌套類的原因,這些可能也只是可以在cpp文件中聲明的小類,隱藏在客戶端在頭文件中看到的內容中。 – 2010-10-04 13:44:21

0

當一個類需要包含分組/封裝數據時,它們非常有用。你可以將它全部設計成嵌套類,以防止外界不小心使用數據類型。

它也可以作爲一種可能更清晰的方式來實現友誼。通過嵌套類而不是使用友誼,您可以進一步封裝代碼部分之間的關​​系。

1

我使用它們很少,原因如下:

  • 他們往往是實現 細節,我不喜歡在 頭文件。
  • 我不喜歡 語法。

有時我使用嵌入式結構(對於POD,沒有方法)。

0

我將它們用作需要訪問我的類的實用程序類:信號處理程序,定時器,特別是在使用pimpl時,因此實現已經存在於cpp文件中。
C++中沒有任何東西不能在沒有嵌套類的情況下完成,但它是限制這些類的一種很好的方法,這些類通常只是派發事件給我的類。