第十一站:多态练习ODU

实现动态切换

ODU.h

复制代码
#pragma once
#include <iostream>
using namespace std;
#define ODU_TYPE_311_FLAG "311"
#define ODU_TYPE_335_FLAG "335"
enum class ODU_TYPE {
	ODU_TYPE_311,
	ODU_TYPE_335,
	ODU_TYPE_UNKNOW
};

class ODU{
public:
	ODU();
	//发射频率
	virtual bool setTxFreq(int);
	virtual int getTxFreq();
	//接收频率
	virtual bool setRxFreq(int);
	virtual int getRxFreq();
	//发射功率
	virtual bool setTxPower(float);
	virtual float getTxPower();
	//获取接收电平
	virtual float getRxl();
	//获取心电包
	virtual bool hearBeat();
	//获取设备的名称
	virtual string name();
	//获取设备类型
	virtual ODU_TYPE getOduType();
protected:
	int TxFreq;
	int RxFreq;
	float TxPower;
	float rxl;
	ODU_TYPE type;
};

ODU335.h

复制代码
#pragma once
#include "ODU.h"
class ODU335 :public ODU{
public:
	ODU335();
	//重写父类heat
	bool hearBeat();
};

ODU.CPP

复制代码
#include "ODU.h"


/*
	int TxFreq;
	int RxFreq;
	float TxPower;
	float rxl;
	ODU_TYPE type;
*/
ODU::ODU(){
	TxFreq = 34100;
	RxFreq = 31000;
	TxPower = 40;
	rxl = 0;
	type = ODU_TYPE::ODU_TYPE_311;
	cout << "调用老设备" << endl;
}

bool ODU::setTxFreq(int frequence)
{
	TxFreq = frequence;
	cout << name() << "设置发射频率为:" << TxFreq << "Hz" << endl;
	return true;
}

int ODU::getTxFreq()
{
	return TxFreq;
}

bool ODU::setRxFreq(int frequence)
{
	RxFreq = frequence;
	cout << name() << "设置接收频率为:" << RxFreq << "Hz" << endl;
	return true;
}

int ODU::getRxFreq()
{
	return RxFreq;
}

bool ODU::setTxPower(float power)
{
	TxPower = power;
	cout << name() << "设置发射功率为:" << TxPower << "dpm" << endl;
	return true;
}

float ODU::getTxPower()
{
	return TxPower;
}

float ODU::getRxl()
{
	return rxl;
}

bool ODU::hearBeat()
{
	cout << name() << "模拟串口协议读取数据:获取心跳包的反馈...[" << ODU_TYPE_311_FLAG
		<< "]";
	string response;
	cin >> response;
	bool ret = false;
	if (response == ODU_TYPE_311_FLAG) {
		type = ODU_TYPE::ODU_TYPE_311;
		ret = true;
	}
	return ret;
}

string ODU::name()
{
	string ret;
	switch (type)
	{
	case ODU_TYPE::ODU_TYPE_311:
		ret = "ODU311";
		break;
	case ODU_TYPE::ODU_TYPE_335:
		ret = "ODU335";
		break;
	case ODU_TYPE::ODU_TYPE_UNKNOW:
	default:
		ret = "ODU_UNKNOW";
		break;
	}
	return ret;
}

ODU_TYPE ODU::getOduType()
{
	return type;
}

ODU335.CPP

复制代码
#include "ODU335.h"
#include "ODU.h"
ODU335::ODU335()
{
	cout << "调用ODU335" << endl;
	type = ODU_TYPE::ODU_TYPE_335;

}

bool ODU335::hearBeat()
{
	cout << name() << "模拟串口协议读取数据:获取心跳包的反馈...[" << ODU_TYPE_335_FLAG
		<< "]";
	string response;
	cin >> response;
	bool ret = false;
	if (response == ODU_TYPE_335_FLAG) {
		type = ODU_TYPE::ODU_TYPE_335;
		ret = true;
	}
	return ret;
}

main.cpp

复制代码
#include <iostream>
#include <Windows.h>
#include <thread>
#include "ODU.h"
#include "ODU335.h"
using namespace std;
ODU* odu = NULL;
void test(ODU* odu) {
	odu->setTxFreq(35000);
	cout << odu->getRxFreq() << endl;
	odu->hearBeat();
}
void oduMonitorHandler() {
	while (1){
		if (odu->hearBeat() == false) {
			//切换odu
			ODU_TYPE type = odu->getOduType();
			switch (type) {
			case ODU_TYPE::ODU_TYPE_311:
				delete odu;
				odu = new ODU335;
				break;
			case ODU_TYPE::ODU_TYPE_335:
				delete odu;
				odu = new ODU;
				break;
			default:
				odu = NULL;
				return;
			}
		}
	}
}
int main(void) {
	odu = new ODU();
	//创建一个线程
	thread oduMonitor(oduMonitorHandler);
	//等待主线程结束
	oduMonitor.join();
	return 0;
}
相关推荐
devmoon5 小时前
为 Pallet 搭建最小化 Mock Runtime 并编写单元测试环境
开发语言·单元测试·区块链·智能合约·polkadot
Physicist in Geophy.5 小时前
一维波动方程(从变分法角度)
线性代数·算法·机器学习
im_AMBER5 小时前
Leetcode 115 分割链表 | 随机链表的复制
数据结构·学习·算法·leetcode
Coder_Boy_5 小时前
Java开发者破局指南:跳出内卷,借AI赋能,搭建系统化知识体系
java·开发语言·人工智能·spring boot·后端·spring
Liue612312315 小时前
【YOLO11】基于C2CGA算法的金属零件涂胶缺陷检测与分类
人工智能·算法·分类
!!!!8135 小时前
蓝桥备赛Day1
数据结构·算法
Mr_Xuhhh5 小时前
介绍一下ref
开发语言·c++·算法
王老师青少年编程5 小时前
2024年信奥赛C++提高组csp-s初赛真题及答案解析(完善程序第2题)
c++·题解·真题·初赛·信奥赛·csp-s·提高组
夏鹏今天学习了吗5 小时前
【LeetCode热题100(99/100)】柱状图中最大的矩形
算法·leetcode·职场和发展
nbsaas-boot5 小时前
软件开发最核心的理念:接口化与组件化
开发语言