比如,如果 变量C 里存储的等于数组或链表里的"Cstu",那么就new Cstu
如果 变量C 里存储的等于数组或链表里的"Ctea",那么就new Ctea
用for循环实现,这样不难啊,为什么不用这个方法呢,多谢!
如果 变量C 里存储的等于数组或链表里的"Ctea",那么就new Ctea
用for循环实现,这样不难啊,为什么不用这个方法呢,多谢!
解决方案 »
- WTL中模态对话框是不是不能重载PreTranslateMessage?
- 我的一个浮点变量的值是 (1.#INF0) 这是 什么意思?
- 怎样使用多重lang文件,来实现多国语言版的应用程序?
- 关于多文档工程中活动区域的判断
- 真是奇怪,我新健mfc工程,在函数里list members那个功能老用不了,谁能告诉我到底怎么回事?
- 基于对话框的程序,如何把里面的文本框中的内容保存到文件中?
- ODBC建立SQL SERVER 数据源
- 为什么我用CreateProcess不能启动Win2k自带的telnet.exe程序?
- 小问题,送分,送完为止?(字符串结束符)
- *** 请问如何把BC4.5编译得到的.lib和.dll 用在Win32程序中? *** 请Searph兄和edyang兄都来看看
- 客户端与服务器通信问题,能不能实现注册和登录用两个不同的端口通信?
- MFC CMap 使用问题
你这个确实可以,但注意红色那句,你不得不有一些先前定义的类型,如果没有预先定义的类型,就无法按照你的方式了。
而MFC最强大之处就在于它不需要预先知道定义了什么类型,你随时可以加入你自己的可以动态创建的对象类型,MFC都可以帮助你创建。
像这样的;read...
if 读取的字符串等于链表中的类名字符串
then
CButton * pButton = new CButton
像这样的,经过比较,程序在创建新对象实体之前,就知道类名了,连类名都知道了,为什么说是一无所知呢,求赐教
你这个确实可以,但注意红色那句,你不得不有一些先前定义的类型,如果没有预先定义的类型,就无法按照你的方式了。
而MFC最强大之处就在于它不需要预先知道定义了什么类型,你随时可以加入你自己的可以动态创建的对象类型,MFC都可以帮助你创建。
你的意思是运行的时候创建class吗,有点费解
宏是编译态的东西
for在编译期只能被编译为一个循环代码,而不能在编译期执行,如果像你想的那么简单,.net就不用出现了
像这样的;read...
if 读取的字符串等于链表中的类名字符串
then
CButton * pButton = new CButton
像这样的,经过比较,程序在创建新对象实体之前,就知道类名了,连类名都知道了,为什么说是一无所知呢,求赐教你去研究一下app类,app类的文件.h,.cpp里有没有include"xxxButton.h" 或者“xxxView.h” 或者别的 可以通过OnFileNew 可以创建的对象的.h文件? 事实上FileNew在运行的时候,根本就不知道要New什么。app初始化的时候,注册若干文档模版类,也只是注册了若干函数指针,而没有类型信息
像这样的;read...
if 读取的字符串等于链表中的类名字符串
then
CButton * pButton = new CButton
像这样的,经过比较,程序在创建新对象实体之前,就知道类名了,连类名都知道了,为什么说是一无所知呢,求赐教另外,CButton应该没有IMPLEMENT_DYNCREATE吧
比如CreateObject的声明为:
void* CreateObject(TCHAR *szClassName);
根据类名动态创建对象并返回指针。我尝试写了一个void* CreateObject(TCHAR *szClassName)
{
if (_tcscmp(szClassName, _T("CWnd")))
return new CWnd;
else if (_tcscmp(szClassName, _T("MyClass"))
return new MyClass;
}但这样用if语句不行,类很多的话代码太长了,得用for循环,可是for循环怎么写,我尝试这样写:void* CreateObject(TCHAR *szClassName)
{
for (int i=0; i<arraylen; i++)
{
if (_tcscmp(szClassName, array[i]))
return new 这里怎么写?;
}
}
你会发现两个问题:
1.要把字符串和对应的类型,成对的放到数组里,这样到时候用for循环遍历。
可是字符串可以放到数组里,类的类型怎么放到数组里呢?
2.CreateObject这个动态创建的函数,是MFC提供的函数,MFC的开发者在编写这个函数的时候,知道MFC都有哪些类类型,比如CWnd、CButton、CString,但是MFC的开发者不知道MyClass这些我们自己后来定义的类型。这样的话,如果我们要动态创建MyClass这样的我们自定义的类型,还得手工去修改MFC提供的库函数CreateObject,也就是去修改MFC的源代码并重新编译MFC源代码,这样是不符合类库的原则的,这样的设计会让类库变得很糟糕。
CRuntimeClass* pClassRef;
CObject* pOb;
while(1)
{
if ((pClassRef = CRuntimeClass::Load()) == NULL)
break; pOb = pClassRef->CreateObject();
if (pOb != NULL)
pOb->SayHello();
}
}
怎么还是用CObject*类型的指针来指向新生成的对象?前面 第2章 “动态生成(Dynamic Creation)”这一节 是这样说的:
你把你的资料储存
到文件,这些资料很可能(通常是)对象中的成员变量 我把它读出来后,势必要依据
文件上的记载,重新new 出那些个对象来。问题在于,即使我的程序有那些类别定义(就
算我的程序和你的程序有一样的内容好了),我能够这么做吗:
char className[30] = getClassName(); // 从文件(或使用者输入)获得一个类别名称
CObject* obj = new classname; // 这一行行不通首先,new classname 这个动作就过不了关。其次,就算过得了关,new 出来的对象究
竟该是什么类别类型?虽然以一个指向MFC 类别老祖宗(CObject)的对象指针来容纳
它绝对没有问题,但终不好总是如此吧!不见得这样子就能够满足你的程序需求啊。
显然,你能够以Serialize 函数写档,我能够以Serialize 函数读档,但我就是没办法恢复
你原来的状态-- 除非我的程序能够「动态生成」。作者在前面说了不用CObject*类型指针来指向新生成的对象,可是在第3章还是这么做了?
//Test Dynamic Creation
CRuntimeClass* pClassRef;
CObject* pOb;
while(1)
{
if ((pClassRef = CRuntimeClass::Load()) == NULL)
break;
pOb = pClassRef->CreateObject();
if (pOb != NULL)
pOb->SayHello();
}
}====================================================
和这一段:你把你的资料储存
到文件,这些资料很可能(通常是)对象中的成员变量 我把它读出来后,势必要依据
文件上的记载,重新new 出那些个对象来。问题在于,即使我的程序有那些类别定义(就
算我的程序和你的程序有一样的内容好了),我能够这么做吗:
char className[30] = getClassName(); // 从文件(或使用者输入)获得一个类别名称
CObject* obj = new classname; // 这一行行不通首先,new classname 这个动作就过不了关。其次,就算过得了关,new 出来的对象究
竟该是什么类别类型?虽然以一个指向MFC 类别老祖宗(CObject)的对象指针来容纳
它绝对没有问题,但终不好总是如此吧!====================================================
想一下, 如果你的类有20行代码, 你是打算在前面加了一行宏, 来实现动态生成
还是愿意把宏展开成100行的代码加进你的类中?new classname当然是不行的, 所以用了CRuntimeClass::CreateObject
在静态链表中遍历到符合的类, 得到该类的CRuntimeClass静态对象
然后是每个类都有一个的m_pfnCreateObject, 这就创建了一个想要对象, 最后用CObject*来返回
当你调用的时候, 返回CObject*是不是又变成了classname* ?