1、头文件拆解
struct部分
struct Detection
{
int class_id{0}; //int class_id = 0;只是代表id
std::string className{};
float confidence{0.0};
cv::Scalar color{};
cv::Rect box{};
};
//使用struct可能是为了强调这个数据结构主要作为数据载体,不需要复杂的封装或方法,且所有成员需要外部可以直接访问。例如,当处理检测结果时,可以直接创建一个Detection实例并访问其成员,而无需通过公共接口方法。
//使用struct:当你主要关注数据的组织和简单数据结构的表示,且不需要严格的封装时。
class部分class Inference { public: Inference(const std::string &onnxModelPath, const cv::Size &modelInputShape = {640, 640}, const std::string &classesTxtFile = "", const bool &runWithCuda = true); std::vector<Detection> runInference(const cv::Mat &input); //在头文件(通常以.h或.hpp为扩展名)中,通常只包含类的声明,定义了类的结构、成员变量、以及成员函数的原型(即函数签名,不包含函数体)。 //分开定义和声明是一种良好的编程实践,它促进了代码的清晰度、可维护性、模块化和高效的编译过程。 //不同的源文件可以根据声明定义不同函数功能。
•类内部的成员函数。
•类的友元函数或友元类(如果该private成员或整个类声明了友元关系)。
•在同一文件中定义的函数,如果该函数被声明为该类的内联友元函数。