人工智能→计算机视觉经典程序实现2:在工程项目程序开发过程中的图像算法类、算子封装继承程序编写方法及调试(智能助手AGI加持DeepSeek/ChatGPT/文心一言/通义千问/豆包/腾讯元宝等)
今天我们继续来学一个工程实践中的实用技能,该技能是身为人工智能领域算法、软件工程师等必备技能:也就是如何将一个编写好的算法程序函数进行封装实现,尤其是存在继承类关系的算子函数进行封装。初步入门该领域的读者可能疑惑了,什么是封装?熟悉面向对象编程的读者可能会首先想到:封装、继承和多态是面向对象开发的三大特性;而我们今天的实用技能涉及到其中两方面特性封装和继承。
人工智能→计算机视觉经典程序实现2-2:在工程项目程序开发过程中的图像算法类、算子封装继承程序编写方法及调试
前言
今天我们继续来学一个工程实践中的实用技能,该技能是身为人工智能领域算法、软件工程师等必备技能:也就是如何将一个编写好的算法程序函数进行封装实现,尤其是存在继承类关系的算子函数进行封装。初步入门该领域的读者可能疑惑了,什么是封装?熟悉面向对象编程的读者可能会首先想到:封装、继承和多态是面向对象开发的三大特性;而我们今天的实用技能涉及到其中两方面特性封装和继承。其实很容易理解:所谓封装就是可以通俗的理解为一种常规的加密技术,我们通常开发的算法函数算子能够看到函数名和函数体,也就是能看到算子函数的源码,实际的工程实践中在我们进行集成工作时,可能我们希望开发的算子函数在使用时只需要开放函数名和参数能够使用就行了,算子函数的函数体也就是函数源码部分进行封装后集成的用户非必要看到,只有开发人员能够从源程序看到源码的这样一种技术实现加密方式。该技术实现一定程度上在工程实践中将算法函数算子的开发成果进行加密保护,只在特定情况由开发人员进行查看和维护的技术实现方式,该方式具有安全性、灵活性和可维护性的平衡,简化代码复杂度,即高内聚低耦合。封装对于算法来讲就好比加密狗对于软件系统,都是一种对开发出来的软件算法进行知识产权保护的一种技术方法。
为了更好的掌握该项技能,我们采用《三步学会函数算子封装及继承类封装》的方法,由浅到深,由易到难,逐步深刻理解并且掌握该技能。第一步:也就是我们前篇学到的:先学习个简单的函数算子的封装,这里我们采用一个简单的函数运算算法算子(加法+减法-乘法*除法/四则运算算法)作为示例重点讲解如何对其进行封装的技能,这样更容易理解和掌握封装的知识技能点,简单的算子封装技能掌握了,那么具有难度的函数算子封装也就掌握了方法,再结合实践练习练习就会了,第二步我们再学习含有类函数的及其函数算子的封装,第三步我们最后再掌握带有继承类的函数算子的封装 。
那么今天我们就开始进行第二步的学习
今天我们来进行《三步学会函数算子封装及继承类封装》的第二步:类函数及其成员函数算子的封装知识学习,在我们学习本帖子之前建议大家先学完或者结合前篇《三步学会函数算子封装及继承类封装》的第一步:函数算子封装的帖子知识进行。
《三步学会函数算子封装及继承类封装》的第二步:类函数及其函数算子封装
1、编写类函数math_FormulaClass{}及其成员函数例如四则运算:加法、减法、乘法、除法程序
函数类名称math_FormulaClass,包含四个成员函数算子:
int math_FormulaClass::algorithm_Add(int a, int b);
int math_FormulaClass::algorithm_Sub(int a, int b);
int math_FormulaClass::algorithm_Mul(int a, int b);
int math_FormulaClass::algorithm_Div(int a, int b);
//声明函数类及成员函数
class math_FormulaClass {
public:
math_FormulaClass();
~math_FormulaClass();
int algorithm_Add(int a, int b);
int algorithm_Sub(int a, int b);
int algorithm_Mul(int a, int b);
int algorithm_Div(int a, int b);
};
//定义函数类及成员函数
#include <iostream>
math_FormulaClass::math_FormulaClass() {}
math_FormulaClass::~math_FormulaClass() {}
int math_FormulaClass::algorithm_Add(int a, int b) {
return a + b;
}
int math_FormulaClass::algorithm_Sub(int a, int b) {
return a - b;
}
int math_FormulaClass::algorithm_Mul(int a, int b){
return a * b;
}
int math_FormulaClass::algorithm_Div(int a, int b){
return a / b;
}
//完成类函数及成员函数算子声明和定义
2、编写封装算法程序对前面写好的函数类math_FormulaClass{}及其成员函数四则运算算子进行封装
(1)、创建函数类工程如图:
(2)、编写封装函数类及其成员函数四则运算算子程序:头文件<pch.h>,主程序文件<pch.cpp>,初始文件<dllmain.cpp>
头文件<pch.h>
// pch.h: 这是预编译标头文件。
#ifndef PCH_H
#define PCH_H
// 添加要在此处预编译的标头
#include "framework.h"
#pragma once
#ifdef MATH_FORMULACLASS_EXPORTS
#define MATH_FORMULACLASS_API __declspec(dllexport)
#else
#define MATH_FORMULACLASS_API __declspec(dllimport)
#endif
//声明函数类及成员函数
class MATH_FORMULACLASS_API math_FormulaClass {
public:
math_FormulaClass();
~math_FormulaClass();
int algorithm_Add(int a, int b);
int algorithm_Sub(int a, int b);
int algorithm_Mul(int a, int b);
int algorithm_Div(int a, int b);
};
#endif //PCH_H
主程序文件<pch.cpp>
// pch.cpp: 与预编译标头对应的源文件
#include "pch.h"
// 当使用预编译的头时,需要使用此源文件,编译才能成功。
#include <iostream>
math_FormulaClass::math_FormulaClass() {}
math_FormulaClass::~math_FormulaClass() {}
int math_FormulaClass::algorithm_Add(int a, int b) {
return a + b;
}
int math_FormulaClass::algorithm_Sub(int a, int b) {
return a - b;
}
int math_FormulaClass::algorithm_Mul(int a, int b) {
return a * b;
}
int math_FormulaClass::algorithm_Div(int a, int b) {
return a / b;
}
初始文件<dllmain.cpp>
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
(3) 点击生成→生成解决方案,完成加减乘除四则运算的函数算子封装,得到生成文件供后续使用。
3、写个测试程序引用前面封装好的函数类math_FormulaClass{}中的成员函数四则运算算子,实现加减乘除四则运算功能。
(1)创建测试程序如图所示
// call_math_FormulaClass.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include <iostream>
#include <pch.h>
using namespace std;
int main()
{
std::cout << "Hello World!\n";
math_FormulaClass mathFormulaclass;
int a = mathFormulaclass.algorithm_Add(2, 4);
int b = mathFormulaclass.algorithm_Sub(4, 2);
int c = mathFormulaclass.algorithm_Mul(4, 2);
int d = mathFormulaclass.algorithm_Div(4, 2);
cout << a << endl;
cout << b << endl;
cout << c << endl;
cout << d << endl;
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
(2)头文件及动静态链接库:头文件<pch.h>(在动态库生成工程中找到),动态链接库文件<math_FormulaClass.dll>,静态链接库文件<math_FormulaClass.lib>;头文件添加到函数头文件引用处,动静态链接库放置到工程目录里面,同时配置环境变量:头文件,库文件;运行程序看函数算子运行结果。
我们到这里就完成了《三步学会函数算子封装及继承类封装》的第二步:类函数及其成员函数算子的封装知识学习,该《三步学会函数算子封装及继承类封装》当前是每一步用一个帖子来完成讲述。现在大家是否也看到了一个有趣的现象:编写的程序中并没有看到四则运算的类函数定义也就是源码,只是类函数实例化,并且引用了类成员函数,然后就通过添加头文件、环境变量配置动静态链接库的方式得到了类函数成员变量方法运行结果。读者朋友们,这个就是封装的神奇之处:把我们写的源程序中的类函数算子数据通过封装保密的方式写到了我们动静态链接库文件中,从而在我们使用时候只需要通过添加头文件对类函数及成员算子进行一个声明,动静态链接库添加路径,我们就能实现类函数的调用,正常的使用函数算法了。看到这里大家是否就更加理解了,封装同时还让程序类及成员算法算子集成开发更加简洁,类函数算子方法作为知识成果受到保密保护,同时实现了程序开发过程中高内聚,低耦合的特点,有利于程序算法的管理维护工作。
参考资料:
1、人工智能→计算机视觉经典程序实现2:在工程项目程序开发过程中的图像算法类、算子封装继承程序编写方法及软件调试
2、【2025最新版】人工智能AI→计算机视觉→机器视觉/深度学习/→在ImageNet等特定数据集的模型识别任务理论及实践:《科学技术与人文社科》(长期更新版)
3、C++ 创建静态链接库和动态链接库
4、动静态链接库封装方法
更多推荐
所有评论(0)