me men to 漢譯為紀念品 紀念物。看到它你能想到過去的樣子。
這裡實際上是 儲存一個對象的狀態以便將來能恢複到這種狀態。 毫無疑問 這將需要耗費記憶體,如果你要儲存一個對象的多個狀態,或者是多個對象的一個狀態。當然你可以用檔案來儲存。不過你得考慮怎麼樣讓這一切方便。
class CommemorableObj
{
private:
int m_i;
public:
void GetMemento( Memento &m)
{
m.i=m_i;
}
void SetMemento(Memento &m )const
{
m_i= m.i;
}
};
class Memento
{
public:
int i;
};
//
CommemorableObj co;
Memento m;
co.GetMemento(m);
//.chang co attribute..
///...
co.SetMemento( m);// restore co
//......上面試一些簡單的執行個體代碼。關鍵是要說明 其實memento 就是一種冗餘。
關於這種模式,我想到了這麼幾個東西 :一是原型模式,另外一個就是拷貝建構函式,
這裡我只說拷貝建構函式,它分為深拷貝和淺拷貝。我想memento應該是一種深拷貝。
我不明白使用這種模式 和 利用深拷貝來儲存一個對象值得留念的狀態有什麼不同。。
。希望有明白的人可以給我留言。
另外,我想知道的是有沒有 萬能的 能用來儲存所有類的對象的值得留念的狀態,以便以後能夠恢複到這種值得留念的狀態。請注意以上代碼,commemorableobj , memento 有相同的資料成員。如果是萬能的話,那就是要求可以不必知道被儲存的有多少個成員。
我想 記憶體複製是一個不錯的注意。實現代碼如下:
#include <iostream>
using namespace std;
class AbstractMemento
{
public:
bool virtual SetMemento( void *p,int bytesize)=0;
bool virtual GetMemento( void *p )const=0;
protected:
private:
};
class A
{
public:
A()
{
m_a = 10;
}
int m_a;
virtual void fna()
{
cout<<"A::m_a"<<m_a<<endl;
}
};
class B
{
public:
int m_b1;
int m_b2;
B()
{
m_b1=100;
}
virtual void fnb()
{
cout<<"B::m_b1"<<m_b1<<endl;
}
};
class C
{
public:
virtual void fnb()
{
}
};
class CMemento:public AbstractMemento
{
public:
CMemento()
{
m_p = NULL;
}
bool virtual SetMemento(void *p,int bytesize)
{
if ( m_p != NULL )
{
return false;
}
m_p = (void *)new char[bytesize];
::memcpy( m_p, p ,bytesize );
m_bs = bytesize;
return true;
}
bool virtual GetMemento( void *p )const
{
if ( m_p == NULL)
{
return false;
}
memcpy( p ,m_p , m_bs );
delete[]m_p; //»á²»»áÓÐÎÊÌâ
//m_p = (void *)NULL; //error
CMemento();
return true;
}
protected:
void *m_p;
int m_bs;
};
int main(int argc, char* argv[])
{
CMemento m;
A a;
m.SetMemento( (void*)&a ,sizeof(a) );
a.fna();
a.m_a = 20;
a.fna();
m.GetMemento( (void*)&a );
a.fna();
CMemento m2;
B b;
m2.SetMemento( (void*)&b ,sizeof(b) );
b.fnb();
b.m_b1 = 20;
b.fnb();
m2.GetMemento( (void*)&b );
b.fnb();
return 0;
}