- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
所以要澄清我的问题...臭名昭著的 GoF 书中的每个模式 - 设计模式Elements of Reusable Object-Oriented Software - 在 C++ 中有它的代码示例。
这些是最新的吗?还是现在 C++ 中的代码看起来很不一样?
我之所以这么问,是因为当我在最后一个问题中发布我的代码时,许多 C++ 开发人员告诉我应该摆脱指针,那里广泛使用的指针......
最佳答案
它们有点过时了,是的。但这些书的部分观点是,这些模式在几种不同的语言和几种不同的风格中都很有用。因此,尽管代码有点陈旧,但其背后的想法却并非如此,而这些想法在这些书中很重要。
我希望看到一些利用元编程技术的模式实现。我强烈怀疑某些模式,例如桥接、适配器和可能的外观,使用元编程实现起来要简单得多。从另一个答案和阅读描述来看,它看起来像 Modern C++ Design: Generic Programming and Design Patterns Applied对于这类事情可能是一本好书。不过我不能亲自担保。
除了可能使用泛型编程和模板技术之外,主要区别在于裸指针在当今的 C++ 中很少见。通常应该使用有效的智能指针类型,因为它们可以为您处理很多资源管理问题。坦率地说,除非您非常清楚自己在做什么,否则我不建议您尝试基于通用编程的设计。
以下是在各种上下文中使用哪种类型的智能指针的一些示例。这些示例假定您有一个包含 TR1(技术报告 1)扩展的 C++:
当你有一个指向它的对象完全拥有的东西的指针时,使用 ::std::auto_ptr
(或 ::std::unique_ptr
在 C++1x 中)。请记住,::std::auto_ptr
不能存储在 STL 容器中,但 ::std::unique_ptr
没有这个问题。示例可能是组件模式(只要没有共享两个子组件)、外观模式和适配器模式。此外,工厂模式可能会生成 ::std::auto_ptr
s(或 C++1x 中的 ::std::unique_ptr
s),除非确实存在产生 ::std::shared_ptr
s.
当你有一个指向共享所有权的东西的指针时,使用 ::std::tr1::shared_ptr
。例如享元模式。此外,在某些情况下,组件模式也可能具有此属性。它在桥接模式中也可能有用。
如果你有一个指向你在逻辑上不拥有的东西的指针,那么 ::std::tr1::weak_ptr
就是要走的路。请记住,如果您使用 ::std::tr1::weak_ptr
您还应该对所有符合逻辑的对象使用 ::std::tr1::shared_ptr
拥有(或共享所有权)指向的项目。观察者模式就是一个例子。
关于c++ - 四人组 - 设计模式 - 这些模式示例是否以过时的方式编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5748983/
我是非洲的一名学生,在我们的土地上,确实存在缓慢且昂贵的互联网连接,这就是为什么每当我们听到安装软件的“在线存储库”方法这个词时都会害怕得发抖。该死的,这通常意味着你必须去别处看看。 问题。(如果没有
我正在使用 OpenCV 1 进行一些图像处理,并且对 cvSetErrMode 函数(它是 CxCore 的一部分)感到困惑。 OpenCV 具有三种错误模式。 叶:调用错误处理程序后程序终止。 父
安装新版 IDEA.14 后,(maven)项目的部署显着增加(从 15 秒增加到 47 秒)。 最佳答案 原因: IDEA 使用 捆绑 Maven的版本 解决方案:设置 (ctrl+alt+S) -
在 .NET 中,您可以将某些方法标记为过时,以便开发人员在尝试使用已弃用的方法时收到警报。 Private Sub FormerMethod() 问题是您只能在您控制的类中执行此操作。当您希望开发
一段时间以来,我一直在尝试自己解决这个问题,但一直没有成功。当我大约有 10% 的时间重新部署我的 Rails 应用程序时,就会发生这种情况。其他 90% 的时间部署顺利进行。 我试了又试,还是没成功
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我正在学习 HTTP/2 协议(protocol)。它是一个带有小消息帧的二进制协议(protocol)。它允许在单个 TCP 连接上进行流复用。从概念上讲,它似乎与 WebSockets 非常相似。
在 Matlabs 的最新版本中,specgram 函数被 spectrogram 取代,文档说明: Note. To obtain the same results for the removed
我们试图在构建时标记外部类型(如 ConfigurationManager)的使用。 自定义代码分析字典可以提供帮助 [1],但仅限于项目中包含源代码的情况。同样,Obsolete 属性适用于项目中包
我将 Anaconda 与 Python 3 结合使用,并尝试安装 cc 包,这是 uber h3 包的要求。 尝试通过以下方式在 anaconda 命令行中安装时: pip install cc 我
我在 Razor 中创建了一个专门用于显示货币的显示模板,现在我想在我的代码中删除它并替换为接受字符串格式(我可以将其设置为“C”)的标准文本显示模板。 然而,出现了很多次,所以我想使用类似 [Obs
我希望我的网站具有如下所示的 URL: example.com/2010/02/my-first-post 我有我的 Post带 slug 的模型字段('我的第一篇文章')和 published_on
4.7 并喜欢在 qgraphicsview 上叠加两个图像。顶部的图像应是半透明的,以便能够透过它看到。最初,两个图像都是完全不透明的。我期望存在一些为每个像素设置全局 alpha 值的函数,但似乎
总结: 我在我的 Swift 代码中犯了一个错误,我已经修复了它。然后我问自己为什么会这样,我该如何避免。我尝试了一些方法,但没有任何帮助。 我把错误和我的想法放在下面。我希望你能教我避免这种错误的正
我正在尝试重命名在 SVN 中跟踪的 Java 包。这一切似乎都有效。它将代码移动到新包等。然而,噩梦就在那时开始,乐趣就开始了,这取决于你的观点。摆脱旧包很难。 我陷入了“过时”或“不存在”消息的循
我们使用 NLog 或 Serilog 进行日志记录。我们正忙于将系统从 ASP.NET 移植到 ASP.NET Core,这 has logging built in . 理想情况下,我们希望放弃
ETag header 的定义 ( https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag ): The ETag HTTP re
我是一名优秀的程序员,十分优秀!