我们可以将类及其实现放在单个头文件中吗?

时间:2013-11-19 22:04:17

标签: c++ class header

我知道模板定义及其实现可以并且必须放在一起,但是(非模板)类怎么样?

就个人而言,如果可能的话,我更喜欢将类及其实现放在一起,因为它使用起来比较简单,只需要在项目中包含头文件,不需要打扰实现文件。

2 个答案:

答案 0 :(得分:5)

可以这样做,但是每次更改实现时都会强制类的所有用户重新编译,重新编译也会变慢。为此,您需要将函数定义设为inline

// in header
struct T {
   void f() { std::cout << "f()\n"; }
   void g();
};

inline void T::g() {
   std::cout << "g()\n";
}

现在问题来自于你的类有静态成员变量,因为那些需要在一个翻译单元中定义。为此,您仍然需要提供.cpp。

无论如何,我建议不要采用这种方法。 当在罗马时,罗马人做,而在C和C ++中则意味着单独编译和分割标题和实现文件。

答案 1 :(得分:3)

简短的回答,是的。

答案越长,是,但有充分的理由不想这样做。随着项目的大小(和复杂性)的增长,对很多地方使用的类(例如,更改日志消息或看似温和的东西)的实现细节的简单更改现在意味着所有文件都在包含该文件目录(间接)的项目需要重新编译。这可以显着增加您的构建时间。