我目前正在尝试探索OpenCV。
当我查找Mat类时,我可以看到它是在mat.hpp
中定义的,它位于包含文件夹中。但是,当我尝试搜索其对应的mat.cpp
时,我发现类定义实际上位于matrix.cpp
中。我想文件名的区别不是问题,只要它包含mat.hpp
即可。但是,标题mat.hpp
也未被包括在内。我知道编译器可能仍然可以编译,但据我所知,这是一个糟糕的编程习惯。
所以,我的问题是,不将头文件包含在源文件中是不正确的做法?是否有任何理由不应该包括在内?
我知道我不需要过多探讨图书馆的详细实施,但这个问题只是出于好奇。
以下是#include
matrix.cpp
部分
#include "precomp.hpp"
#include "opencl_kernels_core.hpp"
#include "bufferpool.impl.hpp"
以下是#include
mat.hpp
部分
#include "opencv2/core/matx.hpp"
#include "opencv2/core/types.hpp"
#include "opencv2/core/bufferpool.hpp"
答案 0 :(得分:3)
简短的回答是:那是项目的演变过程。
答案很长:OpenCV确实(并且仍然)在core.hpp
中声明了许多函数和类,而许多.cpp
文件包含实现。在这种情况下,特定于矩阵的函数(以及Mat
的实现)将在matrix.cpp
中,类的定义(如Mat
)将在core.hpp
中。
随着项目的发展,事情似乎分崩离析(可能只是为了更容易管理)。您可以在this提交中看到,类Mat
已从core.hpp
移出到自己的mat.hpp
中(因此可能与类名匹配)。源文件matrix.cpp
确实包含mat.hpp
,但间接(通过precomp.hpp
和core.hpp
)。
我不认为这种混乱是故意的,只是偶然的。这是不好的做法吗?有人会这么说,但这取决于你决定。
免责声明:我没有使用过OpenCV源代码,但确实在一段时间内广泛使用它。
答案 1 :(得分:3)
在C ++中,当您在头文件中定义一个类,然后在.cpp
文件中定义类成员(方法等)时,该类定义应该在.cpp
文件中可见。这通常通过将带有类定义的头文件包含在定义成员的.cpp
文件中来实现。
在OpenCV中,mat.hpp
间接包含在matrix.cpp
中。 matrix.cpp
包括precomp.hpp
,core.hpp
又包含mat.hpp
,mat.hpp
又包含matrix.cpp
。
因此,mat.hpp
实际上包含在matrix.cpp
中。这里没什么不寻常的。
P.S。文件名不起任何作用。 import * as lib from "lib"
与import express = require("express");
“不同”地命名是没有异常的。