可能重复:
Pros and cons of using nested C++ classes and enumerations?
考虑以下声明。
class A {
public:
class B{
};
};
没什么特别的。
您如何看待这个?
答案 0 :(得分:4)
从概念上讲,它让程序员知道B类专门与A类有关。当你在A类之外使用B类时,你必须使用A :: B类型,它每次都会提醒你, B与A相关。这不会添加任何功能,但会显示关系。
同样,您不必使用继承/组合或类。您可以通过使用结构和函数或多或少地在C中模拟类。这只是一种保持代码更清晰,更直接的方法,让程序员更容易地将代码与设计联系起来。类比公共子类更能实现这一点,但这只是一个例子。
如果它是一个私有/受保护的子类(我认为它不在你的例子中),那么这显然将该类限制为该类的实现以及该类的子节点,这可能是期望的(再次设计)如果该类的唯一用例是在该类(可能还有它的子类)的实现中。
答案 1 :(得分:1)
好处1:命名空间方面
实际上,A
为B
提供了一个命名空间,这可以帮助我们更好地构建代码。考虑vector
的{{1}}和A
iterator
的具体示例。可以说,
B
比
更容易输入,阅读和理解class vector {
public:
class iterator { /*...*/ };
iterator begin() { /*...*/ }
};
特别注意:
当两个类(class vector_iterator {
/*...*/
};
class vector {
public:
vector_iterator begin() { /*...*/ }
};
和vector
)彼此依赖时,即使用彼此的成员时,上面的第二个版本将要求前两个中的一个进行前向声明,在某些情况下,相互类型依赖可能会导致无法解决的情况。 (使用嵌套类,更容易避免此类问题,因为在嵌套类定义的大多数部分中,外部类被认为是完全定义的。这是由于§9.2/ 2。)
您可能还有许多其他数据类型可以维护自己的iterator
,例如iterator
。使用上面的第二个版本,您需要将linked_list
定义为单独的类。类名会变得越来越复杂,你添加的这些“依赖”类型和替代类型越多。
好处2:模板
继续上面的示例,现在考虑一个函数模板,它将一个容器(例如上面定义的linked_list_iterator
和vector
)作为参数并迭代它们:
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)