C++ 读MTK代码 综测校准 PSU经典接口读各种型号开关电源电压或电流 visa

news2024/9/30 11:26:35

为啥要使用接口?因为有多个电源,接口都相似的。再加型号上层很少改动(类型切换)或不用改。
为啥要使用友元?友元函数的主要作用是允许外部函数或类访问被声明为友元的类的私有成员。
如果不使用友元怎么做?最后回答。
在这里插入图片描述

1.C++定义dll接口

// The following ifdef block is the standard way of creating macros which make exporting 
// from a DLL simpler. All files within this DLL are compiled with the PSU_DLL_EXPORTS
// symbol defined on the command line. this symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see 
// PSU_DLL_API functions as being imported from a DLL, whereas this DLL sees symbols
// defined with this macro as being exported.
#pragma once
#ifndef PSU_DLL_H
#define PSU_DLL_H

#ifdef PSU_DLL_EXPORTS
#	define PSU_DLL_API __declspec(dllexport)
#else
#	define PSU_DLL_API __declspec(dllimport)
#endif

#include <tchar.h>

#ifdef __cplusplus
extern "C" {
#endif

//
typedef enum
{
	PSU_UNKONW = -1,
	PSU_BEGIN = 0,
	PSU_Agilent_663xx = 0,
	PSU_Agilent_E3631A,
	PSU_GWINSTTEK_PPH1503D,
	PSU_END
} PSU_TYPE;

typedef enum
{
	PSU_OFF = 0,
	PSU_ON,
} PSU_ONOFF;

//
// PSU Interface
class CPSUInterface
{
	friend PSU_DLL_API CPSUInterface* PSUCreate(const char* pcPsuGpibAddr, PSU_TYPE ePsuType);
protected:
	CPSUInterface();
public:
	virtual ~CPSUInterface(void);

	virtual int PSU_Initialize(double Voltage_Limit, double Current_Limit) = 0;
	virtual int PSU_PowerOnOff(PSU_ONOFF OnOffState) = 0;
	virtual int PSU_Set_VoltCurr(double Target_Voltage, double Target_Current) = 0;
	virtual int PSU_Voltage_Measure(double *Voltage_Result, double *Current_Result) = 0;
	virtual int PSU_DeInitial() = 0;
};

// Can't construct directly, use this, delete the pointer if no longer use
PSU_DLL_API CPSUInterface* PSUCreate(const char* pcPsuGpibAddr, PSU_TYPE ePsuType);

#ifdef __cplusplus
}
#endif

#endif // #ifndef PSU_DLL_H

2.导出接口。导出友元函数。定义基类继承接口类,存放一些通用的变量值,如地址,message等。具体类继承基类。

// PSU_DLL.cpp : Defines the exported functions for the DLL application.
//

#include "stdafx.h"
#include "PSU_DLL.h"

#include "AG663XX.h"
#include "AG3631A.h"
#include "GW1503D.h"


CPSUInterface::CPSUInterface()
{
}

CPSUInterface::~CPSUInterface(void)
{
}


CPSUInterface* PSUCreate(const char* pcPsuGpibAddr, PSU_TYPE ePsuType)
{
	switch (ePsuType)
	{
	case PSU_Agilent_663xx:
		return new CAG663XX(pcPsuGpibAddr, ePsuType);
	case PSU_Agilent_E3631A:
		return new CAG3631A(pcPsuGpibAddr, ePsuType);
	case PSU_GWINSTTEK_PPH1503D:
		return new GW1503D(pcPsuGpibAddr, ePsuType);
	default:
		return NULL;
	}
}


#include "stdafx.h"
#include "PSUBasic.h"


CPSUBasic::CPSUBasic(const char* pcPsuGpibAddr,PSU_TYPE ePsuType )
{
	strcpy_s(m_cPsuGpibAddr, pcPsuGpibAddr);
	m_ePsuType = ePsuType;
	m_bPsuInitFlag = false;
	m_vsPsuHandle = NULL;
	memset(m_cErrorMSG, 0, sizeof(m_cErrorMSG));
}

CPSUBasic::~CPSUBasic(void)
{
}

void CPSUBasic::PSU_GetErrorMsg( char* pcErrorMSG, int iMsgSize)
{
	if (iMsgSize > 100)
		iMsgSize = 100;
	strcpy_s(pcErrorMSG, iMsgSize, m_cErrorMSG);
}

3.友元函数切换多态 返回句柄指针

在这里插入图片描述

4.句柄指针调用具体类

在这里插入图片描述
在这里插入图片描述

5.删除指针。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

如果不使用友元函数,你可以通过提供公共的成员函数或访问器函数来实现对类的私有成员的访问。这可以帮助维持封装性,而无需将外部函数或类声明为友元。以下是一些方法:

  1. 公共成员函数:在类中提供公共成员函数,这些函数可以用于修改或访问私有成员。这是最常见的方式,遵循了封装的概念。

    class MyClass {
    private:
        int privateData;
    
    public:
        int getPrivateData() {
            return privateData;
        }
    
        void setPrivateData(int value) {
            privateData = value;
        }
    };
    

    在这个示例中,getPrivateDatasetPrivateData 是用于获取和设置私有成员 privateData 的公共成员函数。

  2. 访问器函数:如果需要更细粒度的控制,你可以使用访问器函数,这些函数可以用于获取和设置私有成员,同时允许你添加额外的逻辑。

    class MyClass {
    private:
        int privateData;
    
    public:
        int getPrivateData() {
            // 可以在这里添加额外的逻辑
            return privateData;
        }
    
        void setPrivateData(int value) {
            // 可以在这里添加额外的逻辑
            privateData = value;
        }
    };
    

    这种方法允许你在访问私有成员时执行自定义操作,例如范围检查或日志记录。

使用公共成员函数或访问器函数的好处是,它们保持了封装性,同时提供了对私有成员的受控访问,而不需要使用友元函数。友元函数通常是在需要更特殊的访问权限或操作时使用的,但应谨慎使用以保持良好的封装性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1129509.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot Web 分层解耦

目录 分层解耦三层架构介绍代码拆分 分层解耦耦合问题解耦思路 IOC&DIIOC&DI入门IOC详解bean的声明组件扫描 DI详解 在SpringBoot Web请求响应这篇文章的案例中提到&#xff0c;解析XML数据&#xff0c;获取数据的代码&#xff0c;处理数据的逻辑的代码&#xff0c;给页…

教你如何给『linux』打补丁

前言 我们在参与某些开源项目的过程当中&#xff0c;经常会遇到漏洞之类的问题&#xff0c;需要我们打补丁解决。尤其是 Linux 源码&#xff0c;源码代码量较多&#xff0c;在修改完内核并发布新内核的时候&#xff0c;基本采用补丁的方式进行发布&#xff0c;而不是将整个内核…

【LeetCode刷题】2两数相加

2. 两数相加 JAVA代码 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xf…

MAC-设置mysql开机自启动

mac 设置mysql开机自启动 - MoonyHee - 博客园

学习网络编程No.8【应用层协议之HTTP】

引言&#xff1a; 北京时间&#xff1a;2023/10/9/13:03&#xff0c;一晃好多天过去了&#xff0c;9月14号的文章终于在昨天发出去了&#xff0c;也是许久没有更文了&#xff0c;国庆放假期间由于各种原因&#xff0c;在王者峡谷和铲子世界遨游的不亦乐乎&#xff0c;有待改善…

Ubuntu deadsnakes 源安装新版 python

前言 适用于 Ubuntu 安装 python3.11 等新版本。 因为比较常用并且不想重新编译就记录一下&#xff0c;方便以后面向CV安装。 安装 添加 deadsnakes ppa 源 sudo add-apt-repository ppa:deadsnakes/ppa更新 apt sudo apt update安装 python3.11 sudo apt install python…

Node编写获取用户信息接口

目录 前言 初始化路由模块 使用postman发送get获取用户信息请求 初始化路由处理函数模块 获取用户基本信息 前言 在前两篇文章中已经介绍了如何编写用户注册接口以及用户登录接口&#xff0c;这篇文章介绍如何获取用户信息&#xff0c;本篇文章建立在Node编写用户登录接口…

国民技术N32G031 keil开发环境搭建

国民技术N32G031 keil开发环境搭建 目录 国民技术N32G031 keil开发环境搭建1 keil uVison5安装2 安装N32G031的pack包3 JLink添加Device&#xff08;非必须&#xff09;结束语 1 keil uVison5安装 这个网上的教程大把&#xff0c;我这里就不说了&#xff0c;同学们自行下载安装…

图像压缩(2)《数字图像处理》第八章 8.1节 基础知识

图像压缩&#xff08;1&#xff09;《数字图像处理》第八章8.1节基础知识 一. 前言二.引言三.基础知识8.1.1 编码冗余8.1.2 空间冗余和时间冗余8.1.3 不相关的信息8.1.4图像信息的度量8.1.5保真度准则8.1.6 图像压缩模型8.1.7 图像格式、容器和压缩标准四. 小结 一. 前言 始于…

Linux阻塞IO(高级字符设备二)

阻塞IO属于同步 IO&#xff0c;阻塞IO在Linux内核中是非常常用的 IO 模型&#xff0c;所依赖的机制是等待队列。 一、等待队列介绍 在 Linux 驱动程序中&#xff0c;阻塞进程可以使用等待队列来实现。等待队列是内核实现阻塞和唤醒的内核机制&#xff0c;以双循环链表为基础结…

【嵌入式开源库】timeslice的使用,完全解耦的时间片轮询框架构

完全解耦的时间片轮询框架构 简介项目代码timeslice.htimeslice.clist.hlist.c 创建工程移植代码实验函数说明timeslice_task_inittimeslice_task_addtimeslice_tak_deltimeslice_get_task_num 结尾 简介 timeslice是一个时间片轮询框架&#xff0c;他是一个完全解耦的时间片轮…

力扣刷题 day54:10-24

1.十进制整数的反码 每个非负整数 N 都有其二进制表示。例如&#xff0c; 5 可以被表示为二进制 "101"&#xff0c;11 可以用二进制 "1011" 表示&#xff0c;依此类推。注意&#xff0c;除 N 0 外&#xff0c;任何二进制表示中都不含前导零。 二进制的反…

【Java 进阶篇】使用 Java 和 Jsoup 进行 XML 处理

XML&#xff08;可扩展标记语言&#xff09;是一种常用的数据交换格式&#xff0c;它被广泛用于在不同系统之间传递和存储数据。Java作为一种强大的编程语言&#xff0c;提供了多种方式来处理XML数据。其中&#xff0c;Jsoup 是一个流行的Java库&#xff0c;用于解析和操作XML文…

【数据结构练习题】消失的数字 --- 三种解法超详解

✨博客主页&#xff1a;小钱编程成长记 &#x1f388;博客专栏&#xff1a;数据结构练习题 &#x1f388;相关博文&#xff1a;添加逗号 消失的数字 1. &#x1f388;题目2. &#x1f388;解题思路✨方法一&#xff1a;先排序&#xff0c;再找缺失的值✨方法二&#xff1a;按位…

怎么禁止员工上班追剧

怎么禁止员工上班追剧 安企神终端安全管理软件下载使用 说到员工上班追究打游戏摸鱼&#xff0c;其实是一种不负责任的行为&#xff0c;这样的行为不仅会影响到工作效率&#xff0c;还会给周围的同事带来不好的工作氛围&#xff0c;会造成恶性循环&#xff0c;所以&#xff0…

windows下安装配置CGAL

一、下载安装Boost、CGAL 下载地址&#xff1a;https://sourceforge.net/projects/boost/files/boost-binaries/ Boost是CGAL的强制依赖项。SourceForge上提供了Boost的二进制版本&#xff08;此版本无须编译&#xff0c;可直接使用&#xff09;。Boost安装程序会同时安装Boos…

30天精通Nodejs--第二天:模块系统与npm

深入了解Node.js&#xff1a;模块系统与npm Node.js作为一款强大的服务器端JavaScript运行环境&#xff0c;模块系统和npm&#xff08;Node Package Manager&#xff09;是其成功的重要组成部分。为我们平时提供了便捷的工具和资源&#xff0c;使得在Node.js平台上构建应用变得…

五、Qt中的常用类

1. QString 字符串类 QString是Qt中的字符串类&#xff0c;与C/C不同的是&#xff0c;不再使用ASCII编码&#xff0c;而使用Unicode编码。因此一个字符不是8位的char&#xff0c;而是16位的QChar&#xff0c;这就是为什么之前一个汉字占用一个字符的原因。、 QString几乎向前兼…

使用jdbc技术连接数据库

连接数据库 <dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version><scope>compile</scope></dependency> </dependencies> g…

腾讯云阿里云服务器mongdb数据库设置密码

避坑点 数据库绑定ip一定要设置0.0.0.0 设置超级管理员账号密码 1、可以使用navicat15连接mongodb数据库&#xff0c;进入命令行界面&#xff0c;输入以下命令 如出现找不到MongoDB shell为可执行文件&#xff0c;选择设置路径&#xff0c;路径为&#xff1a;MongoDB shell是…