我知道模板定义及其实现可以并且必须放在一起,但是(非模板)类怎么样?
就个人而言,如果可能的话,我更喜欢将类及其实现放在一起,因为它使用起来比较简单,只需要在项目中包含头文件,不需要打扰实现文件。
答案 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)
简短的回答,是的。
答案越长,也是,但有充分的理由不想这样做。随着项目的大小(和复杂性)的增长,对很多地方使用的类(例如,更改日志消息或看似温和的东西)的实现细节的简单更改现在意味着所有文件都在包含该文件目录(或间接)的项目需要重新编译。这可以显着增加您的构建时间。