我应该在C++中分离 cpp 和 h 文件吗?

Should I separate cpp and h file in C++?

本文关键字:文件 cpp C++ 分离 我应该      更新时间:2023-10-16

>我在C++程序中调用了一个模板:

const matrix::CMatrix<double> M1(3,3,{{5.0,0.0,2.0},{1.0,1.0,3.0},{6.0,7.0,7.0}});

我收到这样的链接器错误:

tests.h:15: undefined reference to `matrix::CMatrix<double>::CMatrix(int, int, std::vector<std::vector<double, std::allocator<double> >, std::allocator<std::vector<double, std::allocator<double> > > >)'

经过大量搜索,我终于意识到这是因为我已经将我的 H 和 cpp 文件分开了,template不能容忍它。在C中,建议将c和h文件分开并使用Makefile。但是根据 c++ 中的此类问题,是否仍然建议将 cpp 和 h 文件分开?在h文件中实现某些模板和在cpp文件中实现其他一些功能是不干净的方法。我该怎么办?

编辑:

矩阵.h

template<typename T>
class CMatrix
{
.....

矩阵.cpp

implementation of CMatrix

主.cpp

defining M1

是的,您应该将 CPP 与 .h 文件分开。
这不仅仅是一个建议。

.cpp文件被编译成编译单元,这意味着每个.cpp文件都会被编译成一个.obj文件,其中包含它拥有的所有代码以及它包含的所有代码。

因此,如果 .h 文件中有一些代码包含在许多.cpp文件中,则会多次编译。

现在,当您有多个项目和库时,这一事实可能会变得丑陋。

无论如何,模板是一个不同的问题。
模板小册子在实例化之前不会真正被编译(直到你使用它们(。
然后,编译器为正确的类型创建所需的代码。
它不只是在编译器第一次看到模板化代码(如"常规"代码(时被编译

因此,您需要将该模板化代码放在头文件中,以便编译器在每个使用它的编译单元 (.cpp( 文件中"看到"它。
因此,编译器可以在需要的地方创建正确的代码。

如果要

跨多个文件使用模板,请将模板放在头文件中,以便可以将其包含在其他位置。如果您只需要文件中的模板,请将其放入 cpp 中。

如果模板化方法是私有的,则可以并且应该将定义(方法主体(放在.cpp文件中。如果它们是公共的,则它们只需要位于 .hpp 文件中。

将所有

内容都放在标头中存在一个问题:如果您绘制所有文件的依赖树,将 main.cpp 作为根节点,那么它只有在没有指向上方的依赖项时才有效。这当然是一个伟大而简单的设计,但在实践中,你经常需要一些向后引用(可以是任何东西,比如将某个类作为参数或将某个类作为成员的方法(。在这一点上,你可能会得到很多"不完整的类"编译器错误......