2010-10-04 62 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++中没有任何东西不能在没有嵌套类的情况下完成,但它是限制这些类的一种很好的方法,这些类通常只是派发事件给我的类。