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;
}