内部类声明

时间:2012-11-06 07:43:33

标签: c++ class-design

  

可能重复:
  Pros and cons of using nested C++ classes and enumerations?

考虑以下声明。

class A {
    public:
    class B{
    };
};

没什么特别的。

  • 但这有什么好处?
  • 将一个班级列入另一个班级的原因是什么?
  • 两个类之间没有继承权益。
  • 如果将B放入A中以进行私有名称共享,则A对于B只是一个命名空间,并且有理由将B设为私有。

您如何看待这个?

3 个答案:

答案 0 :(得分:4)

从概念上讲,它让程序员知道B类专门与A类有关。当你在A类之外使用B类时,你必须使用A :: B类型,它每次都会提醒你, B与A相关。这不会添加任何功能,但会显示关系。

同样,您不必使用继承/组合或类。您可以通过使用结构和函数或多或少地在C中模拟类。这只是一种保持代码更清晰,更直接的方法,让程序员更容易地将代码与设计联系起来。类比公共子类更能实现这一点,但这只是一个例子。

如果它是一个私有/受保护的子类(我认为它不在你的例子中),那么这显然将该类限制为该类的实现以及该类的子节点,这可能是期望的(再次设计)如果该类的唯一用例是在该类(可能还有它的子类)的实现中。

答案 1 :(得分:1)

好处1:命名空间方面

实际上,AB提供了一个命名空间,这可以帮助我们更好地构建代码。考虑vector的{​​{1}}和A iterator的具体示例。可以说,

B

更容易输入,阅读和理解
class vector {
public:
  class iterator { /*...*/ };

  iterator begin() { /*...*/ }
};

特别注意:

  1. 当两个类(class vector_iterator { /*...*/ }; class vector { public: vector_iterator begin() { /*...*/ } }; vector)彼此依赖时,即使用彼此的成员时,上面的第二个版本将要求前两个中的一个进行前向声明,在某些情况下,相互类型依赖可能会导致无法解决的情况。 (使用嵌套类,更容易避免此类问题,因为在嵌套类定义的大多数部分中,外部类被认为是完全定义的。这是由于§9.2/ 2。)

  2. 您可能还有许多其他数据类型可以维护自己的iterator,例如iterator。使用上面的第二个版本,您需要将linked_list定义为单独的类。类名会变得越来越复杂,你添加的这些“依赖”类型和替代类型越多。

  3. 好处2:模板

    继续上面的示例,现在考虑一个函数模板,它将一个容器(例如上面定义的linked_list_iteratorvector)作为参数并迭代它们:

    linked_list

    在这个函数中,你显然非常想使用template <typename Container> void iterate(const Container &container) { /*...*/ } 的迭代器类型。如果这是嵌套类型,那很简单:

    Container

    但如果不是,则必须将迭代器类型作为单独的模板参数:

    typename Container::iterator
    

    如果函数参数中没有出现迭代器类型,编译器甚至无法猜测类型。每次调用template <typename Container, typename Iterator> void iterate(const Container &container) { /*...*/ Iterator it = container.begin(); /*...*/ } 函数时,都必须在尖括号中明确添加它。

    最终说明:这与嵌套类是声明为公共还是私有无关。我上面的例子表明公共嵌套类型显然是可取的,因为我认为iterate类型应该能够在容器类之外使用。

答案 2 :(得分:0)

将一个班级列入另一个班级的原因是什么?

  • 如果您需要将B的范围限制为仅适用于A,则内部类定义会有所帮助。因为它将类范围限制为local。这是调用范围本地化。这些是更通用的术语,称为inner class declaration。检查此link
  • 此stackoverflow question可帮助您了解更多信息。