C 用命名模式寫撤銷操作

2021-09-26 09:43:45 字數 2718 閱讀 4632

1.首先建立命令虛基類

.h

//基類虛函式

class command

; virtual ~command(void){};

public:

virtual void redo() = 0;

virtual void undo() = 0;

};

2.建立管理命令的類

.h

#include "command.h"

#include "vector"

using namespace std;

//命令管理類

class commandmanager

;

.cpp

#include "stdafx.h"

#include "commandmanager.h"

commandmanager::commandmanager(void)

commandmanager::~commandmanager(void)

void commandmanager::storecommand(command *cmd)

void commandmanager::clearallcommand()

} m_vecundo.clear();

}void commandmanager::clearredocommand()

} m_vecredo.clear();

}void commandmanager::releaseallcmd()

} m_vecredo.clear();

for (int i = 0; i < (int)m_vecundo.size(); ++i) }

m_vecundo.clear();

}

3.建立儲存命令基類

.h

#include "commandmanager.h"

class cmdhistorymanager :public commandmanager

return m_pcmdhistorymanager;

} static void releaseinstacne();

virtual void undo();

virtual void redo();

private:

static cmdhistorymanager *m_pcmdhistorymanager;

};

.cpp

#include "stdafx.h"

#include "cmdhistorymanager.h"

cmdhistorymanager * cmdhistorymanager::m_pcmdhistorymanager = null;

cmdhistorymanager::cmdhistorymanager(void)

cmdhistorymanager::~cmdhistorymanager(void)

void cmdhistorymanager::undo()

command *cmd = m_vecundo.at(m_vecundo.size() - 1);

cmd->undo();

m_vecundo.pop_back();

m_vecredo.push_back(cmd);

}void cmdhistorymanager::redo()

command *cmd = m_vecredo.at(m_vecredo.size() - 1);

cmd->redo();

m_vecredo.pop_back();

m_vecundo.push_back(cmd);

}void cmdhistorymanager::releaseinstacne()

}

基本類建立完畢;

下面就需要建立實際的命令基類 例如:cmycmd類

#include "command.h"

class cmycmd: public command

;

#include "mycmd.h"

cmycmd::cmycmd()

cmycmd:: cmycmd(int nmoveposbefore, int nmoveposafter)

cmycmd::~cmycmd()

void cmycmd::redo()

void cmycmd::undo()

void cmycmd::movepos(int npos)

建立類物件

cmycmd* pcmd = new cmycmd();

將建立好的類物件儲存到管理命令的類中

cmdhistorymanager::getinstance()->storecommand(pcmd);

撤銷操作

cmdhistorymanager::getinstance()->undo();

恢復操作

cmdhistorymanager::getinstance()->redo();

注意釋放:

cmdhistorymanager::getinstance()->releaseallcmd();

cmdhistorymanager::getinstance()->releaseinstacne();

Python下劃線命名模式

圖案例 含義單領先下劃線 var 指示名稱的命名約定供內部使用。通常不由python直譯器強制執行 萬用字元匯入除外 僅作為程式設計師的提示。單尾拖尾下劃線 var 按慣例使用以避免與python關鍵字命名衝突。雙重領先下劃線 var 在類上下文中使用時觸發名稱修改。由python直譯器強制執行。雙...

Django之URL的命名空間和命名模式

django之url的命名空間和命名模式 url template tag?polls urls.py from django.conf.urls import urlfrom import views polls urlpatterns url r views index name index u...

C 常用命名規範

指標應該應該緊靠資料型別 變數字首 類的成員m 靜態變數s 外部全域性變數g 靜態全域性變數sg 共享全域性變數gg 型別字首 bool b,char ch,int n,long l,float f,double d,指標 p,enum e,陣列 g 常量及巨集定義 全部大寫 作業系統風格 wind...