【问题标题】:Internal class declaration [duplicate]内部类声明 [重复]
【发布时间】:2012-11-06 07:43:33
【问题描述】:

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

考虑以下声明。

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

没什么特别的。

  • 但这有什么好处呢?
  • 将一个类放在另一个类中可能有什么原因?
  • 两个类之间没有继承优势。
  • 如果将 B 放在 A 内部是为了共享其私有名称,那么 A 对于 B 来说只是一个命名空间,因此也有理由将 B 设为私有。

您对此有何看法?

【问题讨论】:

    标签: c++ class-design


    【解决方案1】:

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

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

    如果它是一个私有/受保护的子类(我认为它不在您的示例中),那么这显然将该类限制为该类和该类的子类的实现,这可能是需要的(再次设计方面)如果该类的唯一用例是该类(可能还有它的子类)的实现。

    【讨论】:

    • 所以,你要坚持这样的结构确实允许使用 A 作为 B 的命名空间。对吗?
    • 据我所知,是的。
    【解决方案2】:

    好处 1:命名空间方面

    确实,AB 提供了一个命名空间,这可以帮助我们更好地构建我们的代码。考虑一个具体的例子,vector 代表Aiterator 代表B。可以说,

    class vector {
    public:
      class iterator { /*...*/ };
    
      iterator begin() { /*...*/ }
    };
    

    比输入、阅读和理解更容易

    class vector_iterator {
      /*...*/
    };
    
    class vector {
    public:
      vector_iterator begin() { /*...*/ }
    };
    

    特别注意:

      1234563相互类型依赖可能导致无法解决的情况。 (使用嵌套类更容易避免此类问题,因为在嵌套类定义的大部分部分中,外部类被认为是完全定义。这是由于 §9.2/2。)
    1. 您很可能有许多其他数据类型维护自己的iterator,例如linked_list。使用上面的第二个版本,您需要将linked_list_iterator 定义为一个单独的类。您添加的这些“依赖”类型和替代类型越多,类名称就会变得越长越复杂。

    好处 2:模板

    继续上面的例子,现在考虑一个函数模板,它接受一个容器(例如上面定义的vectorlinked_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 函数时,都必须将其显式添加到尖括号中。

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

    【讨论】:

      【解决方案3】:

      将一个类放在另一个类中的原因可能是什么?

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

      【讨论】:

      • 在这种情况下,任何想要使用它的人都可以使用 B。因为它是 A 的公共成员。
      • 但是,如果 B 在 A 之外,则它不能访问 A 的私有成员(除非您声明为朋友)。检查此链接 - stackoverflow.com/questions/3791296/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 2014-06-17
      相关资源
      最近更新 更多