将一个类拆分到多个头文件中是否可行?

4
我有一个类,包含一些函数和许多运算符。几乎所有的函数和运算符都使用模板,这就是为什么我在头文件中实现它们的原因。这样做使得在代码中查找某些内容非常困难,因此我决定将所有运算符移动到单独的头文件中。
现在我的代码看起来像这样:
fstring.h
class fstring{
    ...
    #include "fstring_operators.h"
}

以及fstring_operators.h

...
template<int RSIZE>
bool operator==(const fstring<RSIZE>& rhs) const {
    return equals(rhs._chars, RSIZE);
}
...

像这样做可以吗?我还省略了fstring_operators.h的头文件保护,因为它除了在fstring.h中不应该被包含在任何地方。


这是完全可能的,但如果没有正确的文档说明,可能会使您的类难以理解。例如,仅仅通过扫描类声明就不容易看出它是否有一些特殊的方法或操作符。 - Some programmer dude
我不知道这是否是“最佳实践”,但我认为这样做没问题,可以帮助保持代码的清晰。然而,作为一般规则,不考虑特定情况,如果你需要它太多次,那可能意味着你的类的设计可以更好。 - ShinTakezou
1
一种选择是在类定义内部声明成员函数,然后在之后进行定义(可以在同一个头文件中或另一个文件中)。这样做可以更容易地找到定义,而无需跳转到不同的文件,并且不会引入只能在特殊位置包含的文件。 - Mike Seymour
看一下boost::facade,还有看一下CRTP。两者都可以解决这个问题。个人而言,我更倾向于使用宏而不是引入头文件,但这只是个人喜好。 - Alexandre C.
2个回答

7
尽管我以前在生产代码中见过这种写法,但我不太赞同,原因有两点:
1)你期望一个类在头文件中就完全定义好。你不应该需要查看其他头文件才能找到你要的内容。
2)你可以在其他地方包含其他头文件。即使没有包含保护,也不能保证它不起作用。

5
我认为你应该将方法定义为自由函数。然后,你可以在常规头文件的底部#include,这是许多C++库采用的做法(其中一些会使操作符文件名以.i或.inl结尾)。
如果你以这种方式做,看起来很好。OP中的写法有点奇怪,即使它能够工作,也可能会让代码维护者和开发工具感到困惑。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接