Mementoパターン

「Memento=記念品」

という事で、記念品パターンです。

って何のこっちゃですよね。

Mementパターンは、カプセル化を保ったままクラスオブジェクトの状態をセーブして復元するためのパターンです。

書いてみよ


// キャラ
class Chara
{
public:
Chara()
{
m_Hp = 55555;
m_Mp = 100;
}

Chara(Memento* m)
{
SetMemento(m);
}

~Chara(){}

Memento* CreateMemento()
{
Memento* m = new Memento;
m->m_Hp = m_Hp;
m->m_Mp = m_Mp;
return m;
}

void SetMemento(Memento* m)
{
m_Hp = m->m_Hp;
m_Mp = m->m_Mp;
}

private:
int m_Hp;
int m_Mp;
};

// 記念品
class Memento
{
// セーブ・ロードユニットのみ作成可能
friend class Chara;
// 外部からMementoオブジェクトを生成出来ないようにしましょう。
private:
Memento(){}
// 殺すのはどこでもOK
public:
~Memento(){}
private:
int m_Hp;
int m_Mp;
};

// main
int main()
{
// キャラ作る
Chara* pChara = new Chara;

// ここで記念品を作っておく
Memento* pMemento = pChara->CreateMemento();

// キャラ殺す
delete pChara;


// ここで記念品を使ってキャラを作り直す。
// 殺す前のキャラと同じパラメータを持つものが出来上がる。
pChara = new Chara(pMemento);

// 記念品を捨てる
delete pMemento;

// キャラ殺す
delete pChara;

// さいなら
return 0;
}


記念品というよりもDNAですね。個人的に。