c++ - 是否有嵌套类的用例?

标签 c++ python ruby oop

我最近看到几个人在 Stackoverflow 上做这样的事情:

class A:
    foo = 1

    class B:
        def blah(self):
            pass

换句话说,它们有嵌套类。这行得通(尽管 Python 新手似乎会遇到问题,因为它的行为不像他们想象的那样),但我想不出有任何理由用任何语言来做这件事,当然在 Python 中也不会。有这样的用例吗?人们为什么要这样做?搜索这个似乎在 C++ 中相当普遍,有充分的理由吗?

最佳答案

将一个类放在另一个类中的主要原因是为了避免仅在一个类中使用因此不属于全局命名空间的事物污染全局命名空间。这甚至适用于 Python,全局命名空间是特定模块的命名空间。例如,如果您有 SomeClass 和 OtherClass,并且它们都需要以专门的方式阅读某些内容,那么最好使用 SomeClass.Reader 和 OtherClass.Reader 而不是 SomeClassReader 和 OtherClassReader。

不过,我从未在 C++ 中遇到过这种情况。 It can be problematic to control access to the outer class' fields from a nested class.在头文件中定义的编译单元中只有一个公共(public)类,而在 CPP 文件中定义一些实用程序类(Qt 库就是一个很好的例子)也是很常见的。这样他们对“局外人”是不可见的,这很好,所以将它们包含在标题中没有多大意义。它还有助于提高二进制兼容性,否则很难维护。好吧,无论如何这都是一种痛苦,但不那么痛苦。

嵌套类真正有用的语言的一个很好的例子是 Java。那里的嵌套类自动有一个指向创建它们的外部类实例的指针(除非您将内部类声明为静态的)。这样您就不需要将“外部”传递给它们的构造函数,您可以仅通过它们的名称来寻址外部类的字段。

关于c++ - 是否有嵌套类的用例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4482901/

相关文章:

c++ - ./test : error while loading shared libraries: libcpprest. so.2.8: 无法打开共享对象文件: 没有那个文件或目录

c++ - 在 ubuntu 20.04 上安装 Catch2 #include <catch2/catch.hpp>

html - Ruby 2.0 CSV 阅读器以不同方式处理 Microsoft Excel 生成的 CSV 文件并且不剥离控制字符

python - 当我在 Python 中实例化类时会发生什么?

python - 如何在 python 列表中立即释放使用的内存?

ruby-on-rails - Gem 在 Rails 应用程序中不可用,但在 Rails 控制台 (IMGKit) 中运行良好

ruby - 如何全局配置 RSpec 以保持 '--color' 和 '--format specdoc' 选项打开

c++ - 带 openGL glRecti 的棋盘格

c++ - 在 C++ 中复制数组的一个问题

python - 防止 scipy 特征向量因计算机而异