本文主要是介绍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模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!