目录

理论

源码


理论

这里只说明一点,使用单例模式,私有成员里放一个成员,这个成员是一个静态成员,把构造函数都屏蔽掉(放到protected或者private中即可)使用一个flag,让其只能生成一次,因为是静态的成员,所以在各个.cpp文件里面都可以用,这样就实现了单例模式的内容,今天刚刚体会到这种功能,仿写了出这样的一套代码!

源码

程序结构如下图所示:

Qt运行截图如下:

串口调试工具运行截图如下:

源码如下:

singleudp.h

#ifndef SINGLEUDP_H
#define SINGLEUDP_H#include <QObject>
#include <QHostAddress>#define NoInstance 0
#define HaveInstance 1QT_BEGIN_NAMESPACE
class QUdpSocket;
QT_END_NAMESPACEclass SingleUDP: public QObject
{Q_OBJECT
public:static int nFlag;static SingleUDP *createObject(const int &port);static void clearTheObject();static void sendMsg(char *msg, QHostAddress address, int peerPort);QUdpSocket *getUdpSocket();~SingleUDP();protected:SingleUDP(const int &port);SingleUDP(){}SingleUDP(const SingleUDP &singleUdp){ Q_UNUSED(singleUdp) }SingleUDP & operator = (SingleUDP &singleUdp){ Q_UNUSED(singleUdp) return *this; }protected slots:void readPendingDatagrams();private:static SingleUDP *m_instance;QUdpSocket *m_udpSocket;
};#endif // SINGLEUDP_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
class QTimer;
QT_END_NAMESPACEnamespace Ui {
class Widget;
}class SingleUDP;class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();protected slots:void timeOut();private:Ui::Widget *ui;SingleUDP *m_singleUDP;QTimer *m_timer;
};#endif // WIDGET_H

main.cpp

#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

singleudp.cpp

#include "singleudp.h"
#include <QUdpSocket>
#include <QMessageBox>
#include <QHostAddress>
#include <QDebug>
#include <QByteArray>int SingleUDP::nFlag = NoInstance;
SingleUDP* SingleUDP::m_instance = NULL;SingleUDP *SingleUDP::createObject(const int &port)
{if(NoInstance == nFlag){nFlag = HaveInstance;m_instance = new SingleUDP(port);return m_instance;}else{return m_instance;}
}void SingleUDP::clearTheObject()
{if(HaveInstance == nFlag){nFlag = NoInstance;delete m_instance;delete m_instance->getUdpSocket();}
}void SingleUDP::sendMsg(char *msg, QHostAddress address, int peerPort)
{if(HaveInstance == nFlag){m_instance->getUdpSocket()->writeDatagram(msg, 128, address, peerPort);return;}qDebug() << "没有实例化socket对象!";return;
}QUdpSocket *SingleUDP::getUdpSocket()
{if(nFlag == NoInstance)return NULL;return m_udpSocket;
}SingleUDP::SingleUDP(const int &port)
{m_udpSocket = new QUdpSocket;if(!m_udpSocket->bind(port)){QMessageBox::information(NULL, "提示", "端口绑定失败:" + m_udpSocket->errorString());}connect(m_udpSocket, SIGNAL(readyRead()), SLOT(readPendingDatagrams()));
}void SingleUDP::readPendingDatagrams()
{while(m_udpSocket->hasPendingDatagrams()){QHostAddress srcAddr;quint16 SrcPort;QByteArray datagram;datagram.resize(m_udpSocket->pendingDatagramSize());m_udpSocket->readDatagram(datagram.data(), datagram.size(), &srcAddr, &SrcPort);qDebug() << "IP:" << srcAddr.toString() << "  port:"<< QString::number(SrcPort) << "数据:" << datagram;}
}SingleUDP::~SingleUDP()
{}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "singleudp.h"#include <QTimer>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);m_singleUDP = SingleUDP::createObject(7755);m_timer = new QTimer;connect(m_timer, SIGNAL(timeout()), this, SLOT(timeOut()));m_timer->start(500);
}Widget::~Widget()
{delete ui;
}void Widget::timeOut()
{SingleUDP::sendMsg("1234567ABCDEFG", QHostAddress("127.0.0.1"), 10000);
}

Qt|设计模式工作笔记-对单例模式进一步的理解(静态加单例实现专门收发UDP对象)相关推荐

  1. Head First设计模式读书笔记五 第六章 命令模式(单例略过)

    本文示例代码材料源自Head First设计模式 以前整理自己整理的链接: https://blog.csdn.net/u011109881/article/details/59675658 极简命令 ...

  2. 【深入设计模式】单例模式—从源码分析内部类单例、枚举单例以及单例模式在框架中的应用

    文章目录 1. 使用静态内部类实现单例模式 1.1 静态内部类单例写法 1.2 如何实现懒加载 1.3 为什么线程安全 2. 枚举类型单例单例模式 2.1 枚举类型单例写法 2.2 枚举类型单例原理 ...

  3. 设计模式学习笔记(1)——单例模式

    单例模式是常用的设计模式之一,作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,特点: 某个类只能有一个实例,避免重复实例化. 必须自行创建这个实例,不允许 ...

  4. Java设计模式学习笔记:单例模式(一)

    今天学到单例模式,对几种单例模式的特点做了一次梳理,从线程安全性和性能两个方面来说. 首先都知道有两种最常见的单例模式:饿汉式和懒汉式,如下: 饿汉式: public class Hangry() { ...

  5. 工作笔记05:imu、底盘车轮、单激光雷达外参校准(基于hdl_graph_slam建图和定位)

    目录 1. imu 校准 1.1 IMU型号 1.2 坐标定义 1.2.1 大地坐标系(WGS84) 1.2.2 当地地理坐标系(ENU) 1.2.3 传感器坐标轴定义 1.3 传感器内参校准 1.4 ...

  6. Qt|C++工作笔记-对虚函数的进一步认识(关键是Qt中如何正确使用,达到想要的效果)

    关于虚函数的简单例子 首先是一个很简单例子,刚学C++的朋友都能理解 源码如下: #include <cstdio> #include <windows.h>static in ...

  7. Qt/C++工作笔记-对vector与QVector中erase操作的进一步认识(区别与联系)

    VS代码如下: #include <iostream> #include <vector> using namespace std;void main(){vector< ...

  8. Qt工作笔记-QMap的进一步操作

    QMap可以放如下类型的数据(key里面放一个类) clear前,内部数据析构后 代码如下: #include <QApplication> #include <QMap> # ...

  9. Qt工作笔记-对QXmlStreamWriter进一步的认识(写复杂的XML文件)

    本程序已经极度精简了, 运行截图如下: 代码如下: #include <QApplication> #include <QXmlStreamWriter> #include & ...

最新文章

  1. Android应用内展示word、excel、pdf、ppt等文件
  2. 利用序列化与反序列化对Java对象进行深度复制
  3. swift 学习- 12 -- 方法
  4. SpringBoot+gradle+idea实现热部署和热加载
  5. Docker修改空间大小
  6. P3600-随机数生成器【dp,数学期望】
  7. Abp vnext 授权(Authorization)
  8. AndroidTestCase常用的两段配置
  9. java hssfsheet_Java中,使用HSSFSheet创建excel模板如何创建一列两行的数据?
  10. JavaScript实现单击上一张和下一张按钮切换图片
  11. 对话夏琳·查布利斯:Primer.AI机器学习工程师是怎样炼成的?
  12. ofdm导频信道估计matlab,ofdm系统中基于导频的信道估计算法的性能分析(样例3)...
  13. html下划线无阴影效果,CSS | 实现下划线的N个姿势
  14. 【注意力机制集锦2】BAMSGEDAN原文、结构、源码详解
  15. 单的axis java教程
  16. [PTA]实验3-6 计算个人所得税
  17. Centos8安装NodeJs-16
  18. 数据分析——用户粘性指标 DAU/MAU
  19. 基于React + Antd 实现的斗兽棋web应用
  20. 吃球球C++ 配合easyX

热门文章

  1. 分享Silverlight/WPF/Windows Phone一周学习导读(11月14日-11月20日)
  2. 我现写掼蛋游戏就是要努力奋斗
  3. 宏锦软件2015年的计划
  4. 每人都有两大炸弹的扎金花2012
  5. 飞鸽传书 v2.51 Build 320 多国语言版
  6. 总结一些C/C++的知识点
  7. 大数据时代,你的信息安全谁负责?
  8. 优化算法笔记|萤火虫算法理解及实现
  9. 上海药物所揭示KRAS突变肿瘤的分子分型和精准治疗新策略
  10. 那个一年发四篇Cell的研究生,后来怎么样了?