我正在研究用于视频播放和录制的类集合。 我有一个主类,它的作用类似于公共接口,有play()stop()pause()record()等方法......然后我有主要的类进行视频解码和视频编码。

我刚刚了解了C ++中嵌套类的存在,我很想知道程序员对使用它们的想法。 我有点小心,并不确定它的好处/缺点是什么,但它们似乎(根据我正在阅读的书)用于我的案例。

本书建议在像我这样的场景中,一个好的解决方案是将主要类嵌套在接口类中,因此客户端不打算使用的类没有单独的文件,并避免任何可能的命名冲突? 我不知道这些理由。 嵌套类对我来说是一个新概念。 只是想看看程序员对这个问题的看法。

===============>>#1 票数:27 已采纳

我有点不愿意在这里使用嵌套类。 如果您为“多媒体驱动程序”创建了一个抽象基类来处理后端内容(主力),以及为前端工作创建一个单独的类,该怎么办? 前端类可以获取指向已实现的驱动程序类的指针/引用(针对适当的媒体类型和情况),并对主力结构执行抽象操作。

我的理念是继续以优雅的方式使客户接触到这两种结构,只是假设它们将被串联使用。

我会在Qt中引用像QTextDocument这样的东西。 您提供了裸机数据处理的直接接口,但将权限传递给像QTextEdit这样的对象来进行操作。

===============>>#2 票数:9

您将使用嵌套类来创建实现主类所需的(小)辅助类。 或者,例如,定义接口(具有抽象方法的类)。

在这种情况下,嵌套类的主要缺点是这使得重用它们变得更加困难。 也许你想在另一个项目中使用你的VideoDecoder类。 如果你把它作为一个嵌套的VideoPlayer类,你就不能以优雅的方式做到这一点。

相反,将其他类放在单独的.h / .cpp文件中,然后可以在VideoPlayer类中使用这些文件。 VideoPlayer的客户端现在只需要包含声明VideoPlayer的文件,但仍然不需要知道如何实现它。

===============>>#3 票数:5

决定是否使用嵌套类的一种方法是考虑这个类是否扮演支持角色或者它自己的角色。

如果它仅仅是为了帮助另一个类而存在,那么我通常将它作为一个嵌套类。 对此有一大堆警告,其中一些似乎是矛盾的,但这一切都归结为经验和直觉。

===============>>#4 票数:4

我们遇到了一个半旧的Sun C ++编译器的问题,以及嵌套类的可见性,这些行为在标准中发生了变化。 当然,如果您计划在包括旧编译器在内的许多平台上编译软件,那么这不是不进行嵌套类的理由。

===============>>#5 票数:4

好吧,如果您在Interface类中使用指向您的主力类的指针并且不将它们作为参数公开或在接口方法中返回类型,则不需要在接口头文件中包含这些工作马的定义(您只需转发声明他们)。 这样,您的界面的用户将不需要知道后台的类。

你绝对不需要为此嵌套类。 实际上,单独的类文件实际上会使您的代码在项目增长时更易读,更易于管理。 如果你需要子类(比如针对不同的内容/编解码器类型),它也会在以后帮助你。

以下是有关PIMPL模式的更多信息(第3.1.1节)。

===============>>#6 票数:4

听起来像你可以使用策略模式的情况

===============>>#7 票数:4

有时隐藏用户的实现类是适当的 - 在这些情况下,最好将它们放在foo_internal.h中而不是公共类定义中。 这样,你的foo.h的读者就不会看到你不喜欢的东西,但你仍然可以针对你的界面的每个具体实现编写测试。

===============>>#8 票数:2

只有在无法使用可能的外部类的公共接口将它作为单独的类实现时,才应该使用内部类。 内部类增加了类的大小,复杂性和责任,因此应该谨慎使用它们。

您的编码器/解码器类听起来更适合策略模式

===============>>#9 票数:1

避免嵌套类的一个原因是,如果您打算使用swig( http://www.swig.org )包装代码以与其他语言一起使用。 Swig目前在嵌套类方面存在问题,因此与暴露任何嵌套类的库接口变得非常痛苦。

===============>>#10 票数:1

另外要记住的是,您是否设想过工作函数的不同实现(例如解码和编码)。 在这种情况下,您肯定需要一个具有不同具体类的抽象基类来实现这些功能。 为每种类型的实现嵌套一个单独的子类是不合适的。

  ask by JimDaniel translate from so

未解决问题?本站智能推荐:

1回复

MATLAB中的嵌套类

我有2个班: 和 我应该如何在Car类中嵌套Engine类? 我的想法是按照Honda.Engine.Valve.getDiameter()做一些事情。 在Python中,我需要做的就是缩进,我不知道该怎么做。
2回复

在Java中返回嵌套的类类型

我有一个具有抽象getType()方法的基类。 我希望子类能够实现此方法并提供要使用的实际类。 在代码中,类似于以下内容: 这里的问题是我在标记的行中得到“MyTile无法解析”。 所以我试图回复这个: 返回新的MyTile()。getClass() 但现在E
1回复

嵌套类中的子对象数组,并在.Net中访问子对象

我有一个嵌套的类,我们称它为class1,它里面有class2。 VB.Net例如: 我在主项目中的课外定义了cls1对象: 昏暗的cls1作为新的class1 现在在cls1中创建了一个class2数组。 3)现在,如何使用所有可用的属性和方法访问所有它们[在cl
2回复

C ++有一个嵌套类继承自另一个嵌套类

我正在编写一个跨平台的类层次结构,并且希望将平台相关的实现保留在它们自己的类中(而不是让一个类具有#ifdefs )。 这是我到目前为止,但编译器抱怨BaseDef是私有的。 任何帮助我如何保持这个基本结构,同时让它编译将非常感谢:-) 编辑:从这里看来,这是不可能的。 我可以保持这
1回复

从子类嵌套类访问基类方法

问题扩展了这个问题 情况如下。 我正在扩展内部类的虚拟方法: 这是一张试图澄清问题的图片:) InnerClass在其方法中使用ofthenUsedMethod() ,并可以访问它。 为了能够扩展方法,我需要访问ofthenUsedMethod()在DerivedInne
1回复

在其内部的类之外声明嵌套类?

我有一个类的声明对于单个头文件来说太too肿。 我将类和结构嵌套在其中,以加强它们之间的关系,因此我想将它们保持在一起(在某种意义上,我必须使用最外面的类的名称空间来使用其中的类) 有没有办法从另一个头文件中声明嵌套类? 或者至少在另一个头文件中声明嵌套类的方法? (每个类有很多方法
1回复

嵌套类未命名类型

在g ++ List.cc:19:1: error: âIteratorâ does not name a type 。 标头如下 第19行是: 这是继承问题吗? 我试图通过List :: Iterator像std :: list一样在主函数中调用iterator
1回复

嵌套类的成员函数返回嵌套类的类型

我在这样的课程中有一个结构 我想在struct b之外定义foo 。 我怎么做?
1回复

扩展嵌套类方法

我在嵌套类中遇到过虚方法。 我是ClassOne子类,需要扩展method1() 。 在那种情况下,嵌套类需要做些什么? 我尝试了什么 但是它给出了multiple definition of ClassOne::InnerClass::method1()的multipl
1回复

如何从C ++中的嵌套类调用变量

所以我的代码有点像这样 首先,类中的代码结构是否存在任何问题,其次,我该在注释的什么地方显示在int main()中初始化的foo2对象中的字符串a?