在哪里写一个类的实现

时间:2014-04-13 15:43:10

标签: c++ class oop

我通常为我的类创建一个头文件,并在其中编写声明和实现。

我在更大的项目中经历过代码,似乎他们只在头文件中做声明并创建另一个.cpp / .c文件来编写实现。

这样做有哪些优点/缺点?

5 个答案:

答案 0 :(得分:1)

这是您想要编写代码的标准模式。它更具可读性。 如果您希望公共方法是内联的(通常是getter),则必须在标头中写入它。您还必须在标题中定义模板函数和方法。

然而在其他所有情况下,你都应该在cpp中这样做。 也许它会给你一些更小的二进制文件,因为你没有将函数的实现包含在你包含头文件的每个文件中,但实际上它并不是什么大问题。

基本上,类的用户只想看到类的接口,而不是实现,而实际工作的人通常希望看到实现。因此,将这些部分分开是个好主意。

它还会减少编译时间,因为你从不包含cpp文件。因此,您可以在cpp中包含您想要的任何内容,而如果您在标题中包含大量内容,则它将包含在任何位置,其中包含标题。 (如果你不使用cpp文件,你甚至可以得到一些循环的依赖项)

答案 1 :(得分:1)

一个原因是分离界面和实现。主要用途是在开发库并希望共享该库时,您只希望库用户知道接口而不是实现。

答案 2 :(得分:0)

如果您正在编写类(cpp文件)的实现,则您的代码更易于管理。但是如果想在类中创建简短方法,可以使用inline关键字在标题中编写实现。

答案 3 :(得分:0)

这个主题有很多方面。以下是一些想法:

  • 如果您希望将函数用于内联优化,则必须将其放在标题中。
  • 模板通常直接放入标题中。
  • getter / setter等短函数通常直接放在标题中。
  • 具有短数学计算的函数可以放在标题中。
  • 更复杂的功能在源文件中更好,以保持标题清晰简洁。
  • 如果你有像struct A { B* p; ... }; struct B { A* p; ... };这样的循环依赖的类,那么使用另一个类的A / B的成员函数必须放在源文件中。
  • 将大部分代码放在源文件中是一种很好的风格。

答案 4 :(得分:0)

好几个答案"已经,但我要说的是,将声明和实施分开的一个主要原因是你[希望,如果你认为你的设计通过等]在开发过程中经常改变声明,但你做到了,经常变化,在开发过程中实施。

然后,好处是您只需要实际编译该特定类的实现文件,而不是"在标题"中包含接口声明的每个文件。

当然,必须通过内联函数来调节这一点。

对于小型到小型项目,它没什么区别。对于大型项目,它确实有所作为。例如,如果我修改" parser.cpp"对于我的Pascal编译器,构建新编译器需要26秒。如果我修改一个导致"所有内容的头文件"要重建,需要1分28秒才能建成。这个项目只有10个源文件(因为我使用llvm作为后端部分)。想象一个包含60个源文件的项目。