Qt C++ memento模式

2024-03-31 09:58
文章标签 c++ 模式 qt memento

本文主要是介绍Qt C++ memento模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

还记得Undo,Redo操作吗,就是采用的是memento模式,保留一个类的内部对象,通过友元来实现。


memento.h

#pragma once


#include <QDebug>
#include <QStack>


class CMemento
{
private:
CMemento(){};


private:
void set_state(int x,int y,QString name);


private:
int m_x;
int m_y;
QString m_name;


friend class CRectangle;
};


class CRectangle
{
public:
CRectangle(int x,int y,QString name)
:m_x(x),m_y(y),m_name(name)
{


}

~CRectangle()
{
qDeleteAll(m_stack);
}


void setCoordinate(int x,int y)
{
m_x = x;
m_y = y;
}


void setName(const QString &name)
{
m_name = name;
}


void printProperty();
//创建保留对象
CMemento* createMemento();
//恢复属性值
void setResume();


private:
int m_x;
int m_y;
QString m_name;
QStack<CMemento* > m_stack;
};

memento.cpp

#include "memento.h"


void CMemento::set_state(int x,int y,QString name)
{
m_x = x;
m_y = y;
m_name = name;
}


CMemento* CRectangle::createMemento()
{
CMemento* memento = new CMemento;
memento->set_state(m_x,m_y,m_name);
m_stack.push(memento);
return memento;
}


void CRectangle::setResume()
{
if (!m_stack.isEmpty())
{
CMemento* memento = m_stack.pop();
m_x = memento->m_x;
m_y = memento->m_y;
m_name = memento->m_name;
}
printProperty();
}


void CRectangle::printProperty()
{
qDebug() << QString::number(m_x);
qDebug() << QString::number(m_y);
qDebug() << m_name;
}

main.cpp

#include <QApplication>
#include "memento.h"


int main(int argc,char **argv)
{
QApplication app(argc,argv);

CRectangle *rect = new CRectangle(100,100,"jiji");
rect->createMemento();
rect->setName("zhuzhu");
rect->setCoordinate(200,200);
rect->createMemento();
rect->setName("niuniu");
rect->setCoordinate(50,50);
rect->createMemento();

//第一次恢复
rect->setResume();
//第二次恢复
rect->setResume();
//恢复
rect->setResume();
return app.exec();
}


这篇关于Qt C++ memento模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/864067

相关文章

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性: