C++ 一头多源

标签 c++ header include

我有一个大类Foo1:

class Foo {
public:
    void apples1();
    void apples2();
    void apples3();

    void oranges1();
    void oranges2();
    void oranges3();
}

拆分类不是一个选项2,但是foo.cpp 文件已经变得相当大。将类的定义保留在 foo.h 中并将函数的实现拆分为 foo_apples.cppfoo_oranges.cpp< 是否存在重大设计缺陷.

这里的目标纯粹是为了我和其他在包含此类的系统上工作的开发人员的可读性和组织性。


1“大”是指大约 4000 行,不是机器生成的。
2为什么?好吧,applesoranges 实际上是对图进行运算但彼此广泛使用的算法类别。它们可以分开,但由于工作的研究性质,我不断地重新布线每个算法的工作方式,我发现这些算法(在早期阶段)不符合经典的 OOP 原则。

最佳答案

Are there any major design flaws to keeping the definition of the class in foo.h and splitting the implementation of the functions into foo_apples.cpp and foo_oranges.cpp.

挑剔:将类的声明保留在 foo.h 中并拆分方法定义是否存在任何重大设计缺陷em> 进入 foo_apples.cpp 和 foo_oranges.cpp。

1) apples 和 oranges 可能使用相同的私有(private)程序。这方面的一个例子是在匿名命名空间中找到的实现。

在那种情况下,一个要求是确保您的静态数据没有被多重定义。如果内联函数不使用静态数据(尽管它们的定义可能会多次导出),那么它们并不是真正的问题。

为了克服这些问题,您可能会倾向于在类中使用存储——这可能会通过增加本来会被隐藏的数据/类型来引入依赖关系。无论哪种情况,它都会增加复杂性或迫使您以不同的方式编写程序。

2) 增加了静态初始化的复杂度。

3) 它增加了编译时间

我在非常大的程序中使用的替代方法(顺便说一句,许多开发人员讨厌这种方法)是创建一个导出的本地 header 的集合。这些 header 仅对包/库可见。在您的示例中,可以通过创建以下 header 来说明:Foo.static.exported.hpp(如果需要)+ Foo.private.exported.hpp(如果需要) + Foo.apples.exported.hpp + Foo.oranges.exported.hpp.

然后你会像这样写 Foo.cpp:

#include "DEPENDENCIES.hpp"
#include "Foo.static.exported.hpp" /* if needed */
#include "Foo.private.exported.hpp" /* if needed */
#include "Foo.apples.exported.hpp"
#include "Foo.oranges.exported.hpp"

/* no definitions here */

您可以根据需要轻松调整这些文件的划分方式。如果您使用 C++ 约定编写程序,那么在巨大的 TU 之间很少会发生冲突。如果您像 C 程序员一样编写代码(大量全局变量、预处理器滥用、低警告级别和自由声明),那么这种方法将暴露出许多您可能不愿意纠正的问题。

关于C++ 一头多源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7170232/

相关文章:

c++ - 如何在win32中获取鼠标光标的RGB字节数组?

c++ - Dynamic_cast 失败,即使我(据我所知)肯定是从一个正确派生的类中转换的。

gradle - 通过绝对路径添加本地 Gradle 源模块

perl - 如何在模块中包含排序功能?

regex - AS3 正则表达式 不包括?

c++ - 找到玩家说的话并阻止它

c++ - 无法在其他类 C++ 之前访问类

html - 为什么 <h1> 在 &lt;header&gt; 中?

android - 在 DrawerLayout 中滚动时标题后面的项目列表

c++ - 如何从 C++ 程序调用 LLVM 代码并将数据传递给它