声明一动态创建的作用是只要知道类的名字就可以产生一个类的实例。 这个在产生文档时是很有用的。例如加入当我们使用 new CMultiDocTemplate(IDR_MAINFRAME, RUNTIME_CLASS(CChildFram),RUNTIME_CLASS(CMyDocument),RUNTIME_CLASS(CMyView));时传给CMultiDocTemplate的实际上是三个CRuntimeClass的结构。它有一个字符型的字段lpszClassName保存了类的名称。一般情况下它的值是class后面跟类名。另有一个字段pfnCreateObject,就是用类名来产生类的实例的函数。如果没有DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE则pfnCreateObject的值为NULL,加入IMPLEMENT_DYNCREATE实际上就加入了加入了这个函数的实现。因些可以动太产生类的实例。另外在串行化的时候也必须能够动态生成。因为保存动文件中的内容是类的名称。实际上DECLARE_SERIALIZE和IMPLEMENT_SERIALIZE己经包含DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE
这个在产生文档时是很有用的。例如加入当我们使用
new CMultiDocTemplate(IDR_MAINFRAME, RUNTIME_CLASS(CChildFram),RUNTIME_CLASS(CMyDocument),RUNTIME_CLASS(CMyView));时传给CMultiDocTemplate的实际上是三个CRuntimeClass的结构。它有一个字符型的字段lpszClassName保存了类的名称。一般情况下它的值是class后面跟类名。另有一个字段pfnCreateObject,就是用类名来产生类的实例的函数。如果没有DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE则pfnCreateObject的值为NULL,加入IMPLEMENT_DYNCREATE实际上就加入了加入了这个函数的实现。因些可以动太产生类的实例。另外在串行化的时候也必须能够动态生成。因为保存动文件中的内容是类的名称。实际上DECLARE_SERIALIZE和IMPLEMENT_SERIALIZE己经包含DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE
不能.
TCHAR strClass ="CMyClass"
CMyClass *class =new strClass;
这样显然是错误的.
但我们可以这样啊:
CMyClass *class =new CMyClass;既然已经保护了CMyClass的头文件.上面的语句也可以创建对象啊.为什么一定要用RUNTIME_CLASS(CMyClass)->CreateObject.而不用
CMyClass *class =new CMyClass;呢.?请多指教.
TCHAR strClass ="CMyClass";
RUNTIME_CLASS(strClass)->CreateObject.是对的吗?
CMyClass *class =new strClass;
这样显然是错误的.
但我们可以这样啊:
CMyClass *class =new CMyClass;既然已经保护了CMyClass的头文件.上面的语句也可以创建对象啊.为什么一定要用RUNTIME_CLASS(CMyClass)->CreateObject.而不用
CMyClass *class =new CMyClass;呢.?
--------------------
你怎么就确定字符串的的类是CMyClass呢???虽然"上面的语句也可以创建对象",但如果有字符串中的类名是另一个呢?
当然你可以这样:
include所有可能要生成的类的头文件,然后:
if(strClass=="classA")生成ClassA的实例;
if(strClass=="ClassB")生成ClassB的实例;但太麻烦,而且代码"不够弹性和优雅"...详细请看深入浅出MFC中jjhou的说法...............
我对RunTimeClass也不是很了解:)
TCHAR strClass ="CMyClass";
RUNTIME_CLASS(strClass)->CreateObject.
一般情况下我们很少用CRuntimeClass的CreateObject来产生一个类的实例。如果一定要这么做,可能像这样
char szClassName[64];
CRuntimeClass* pClass;
cout << "enter a class name... ";
cin >> szClassName;
for (pClass = pFirstClass; pClass != NULL;
pClass = pClass->m_pNextClass)
{
if (strcmp(szClassName, pClass->m_lpszClassName) == 0)
pClass ->CreateObject();
break;
}