有没有一种方法可以避免在C ++中重复方法原型?

时间:2009-10-30 11:15:33

标签: c++ coding-style dry

大多数C ++类方法签名通常在头文件中的声明和我读过的代码中的源文件中的定义之间重复。我觉得这种重复是不可取的,而且这种代码编写方式会受到参考位置不佳的影响。例如,源文件中的方法通常引用头文件中声明的实例变量;您最终必须在阅读代码时不断在头文件和源文件之间切换。

有人会建议一种避免这样做的方法吗?或者,我是否主要通过不按常规方式做事来混淆经验丰富的C ++程序员?

另请参阅Question 538255 C++ code in header files,其中有人被告知所有内容都应放在标题中。

5 个答案:

答案 0 :(得分:9)

还有另一种方法,但治愈方法比疾病更糟糕 - 在标题中定义所有函数体,甚至在类中内联,如C#。缺点是这会大大增加编译时间,并且会让资深的C ++程序员烦恼。它还可以让你进入一些令人讨厌的循环依赖情况,虽然可以解决,但是处理起来很麻烦。

就个人而言,我只是将我的IDE设置为垂直拆分,并将头文件放在右侧,将源文件放在左侧。

答案 1 :(得分:6)

我假设你在谈论头文件中的成员函数声明和源文件中的 definitions

如果你习惯了Java / Python /等。模型,它似乎是多余的。实际上,如果你如此倾向,你可以在类定义中(在头文件中)内联定义所有函数。但是,每当你改变实施中的任何细微之处时,你肯定会违反常规并付出额外耦合和编译时间的代价。

最初为大规模系统设计的C ++,Ada和其他语言因为一个原因而隐藏了定义 - 没有充分的理由让一个类的用户必须关注它的实现,也没有任何理由他们应该反复付钱编译它。现在使用更快的系统可以减少问题,但仍然与真正的大型系统相关。此外,隔离和更快的编译可以促进TDD,存根和其他测试策略。

答案 2 :(得分:4)

不要违反惯例。最后,你会制造一个效果不佳的蠕虫球。另外,编译器会讨厌你。出于某种原因,C / C ++就是这样设置的。

答案 3 :(得分:3)

C ++语言支持函数重载,这意味着整个函数签名基本上是一种识别特定函数的方法。因此,只要您分别声明定义函数,就不必再次列出参数的冗余。更准确地说,必须列出参数 types 并不是多余的。另一方面,参数名称在此过程中不起作用,您可以在声明中(即在头文件中)省略它们,尽管我认为这限制了可读性。

答案 4 :(得分:0)

你“可以”解决问题。您定义了一个抽象接口类,它只包含外部应用程序将调用的纯虚函数。然后在CPP文件中提供从接口派生的实际类,并包含所有类变量。你现在正常实施。这需要的唯一方法是从接口类实例化派生的实现类。您可以通过提供静态“创建”功能来实现,该功能在CPP文件中具有实现。

InterfaceClass* InterfaceClass::Create()
{
     return new ImplementationClass;
}

这样您就可以有效地隐藏任何外部用户的实现。但是,您不能仅在堆上创建堆栈上的类...但它确实解决了您的问题并提供了更好的抽象层。最后,如果你不准备这样做,你需要坚持你正在做的事情。