c++ - 您使用什么模式来分离 C++ 中的接口(interface)和实现?

标签 c++ delegation pimpl-idiom

大型 C++ 项目中的一个问题可能是构建时间。在你的依赖树中有一些你需要处理的类,但通常你会避免这样做,因为每次构建都需要很长时间。你不一定想改变它的公共(public)接口(interface),但也许你想改变它的私有(private)成员(添加一个缓存变量,提取一个私有(private)方法,......)。您面临的问题是,在 C++ 中,即使是私有(private)成员也是在公共(public)头文件中声明的,因此您的构建系统需要重新编译所有内容。

遇到这种情况你会怎么做?

我列出了两个我知道的解决方案,但它们都有缺点,也许还有一个我还没有想到的更好的解决方案。

最佳答案

疙瘩图案:

在您的头文件中,仅声明公共(public)方法和私有(private)指针(pimpl 指针或委托(delegate))到前向声明的实现类。

在您的源代码中,声明实现类,将公共(public)类的每个公共(public)方法转发给委托(delegate),并在公共(public)类的每个构造函数中构造一个 pimpl 类的实例。

加上:

  • 允许您更改类的实现而无需重新编译所有内容。
  • 继承效果很好,只是语法有点不同。

减去:

  • 要编写大量愚蠢的方法体来进行委托(delegate)。
  • 调试起来有点尴尬,因为您有大量委托(delegate)要逐步完成。
  • 基类中的额外指针,如果您有很多小对象,这可能是个问题。

关于c++ - 您使用什么模式来分离 C++ 中的接口(interface)和实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/973000/

相关文章:

c++ - Pimpl 习语和没有友元声明的内部对象协作

c++ - 3d max 与 c++ 的集成,Cal3D 从哪里开始?

iOS MVVM : Is Delegation Pattern a Requirement?

c++ - 为什么在使用 PIMPL 习语时这种类型不完整?

java - 向 Java 程序员解释 Objective-C 委托(delegate)

c++ - 在 c++ () 或 {} 中委托(delegate)构造函数

c++ - 是否可以使用右值引用作为 pimpl 句柄?

c++ - 类型转换指针和三元? : operator. 我是重新发明了轮子吗?

c++ - QSettings : is there a limit in . ini文件行长度?

C++ 宏汇编错误