比如,如果 变量C 里存储的等于数组或链表里的"Cstu",那么就new  Cstu
如果 变量C 里存储的等于数组或链表里的"Ctea",那么就new  Ctea
用for循环实现,这样不难啊,为什么不用这个方法呢,多谢!

解决方案 »

  1.   

    执行动态创建的创建者对于要创建的对象,除了其要创建的对象的长度和有一个叫CreateObject的方法的函数指针外,一无所知,因此不可能使用new方法进行创建。
      

  2.   


    你这个确实可以,但注意红色那句,你不得不有一些先前定义的类型,如果没有预先定义的类型,就无法按照你的方式了。
    而MFC最强大之处就在于它不需要预先知道定义了什么类型,你随时可以加入你自己的可以动态创建的对象类型,MFC都可以帮助你创建。
      

  3.   

    这部分宏就是为了省代码,不然出现一个类,都得自己copy很多代码。还容易出错
      

  4.   

    但是我试过了,
    像这样的;read...
    if 读取的字符串等于链表中的类名字符串
    then 
    CButton * pButton = new CButton
    像这样的,经过比较,程序在创建新对象实体之前,就知道类名了,连类名都知道了,为什么说是一无所知呢,求赐教
      

  5.   


    你这个确实可以,但注意红色那句,你不得不有一些先前定义的类型,如果没有预先定义的类型,就无法按照你的方式了。
    而MFC最强大之处就在于它不需要预先知道定义了什么类型,你随时可以加入你自己的可以动态创建的对象类型,MFC都可以帮助你创建。
    你的意思是运行的时候创建class吗,有点费解
      

  6.   

    for 是运行态的东西,
    宏是编译态的东西
      

  7.   

    c++ 的class 之类只是在编译期间有效,编译为二进制代码,就不存在什么class 了
    for在编译期只能被编译为一个循环代码,而不能在编译期执行,如果像你想的那么简单,.net就不用出现了
      

  8.   

    但是我试过了,
    像这样的;read...
    if 读取的字符串等于链表中的类名字符串
    then 
    CButton * pButton = new CButton
    像这样的,经过比较,程序在创建新对象实体之前,就知道类名了,连类名都知道了,为什么说是一无所知呢,求赐教你去研究一下app类,app类的文件.h,.cpp里有没有include"xxxButton.h"  或者“xxxView.h” 或者别的 可以通过OnFileNew 可以创建的对象的.h文件? 事实上FileNew在运行的时候,根本就不知道要New什么。app初始化的时候,注册若干文档模版类,也只是注册了若干函数指针,而没有类型信息
      

  9.   

    但是我试过了,
    像这样的;read...
    if 读取的字符串等于链表中的类名字符串
    then 
    CButton * pButton = new CButton
    像这样的,经过比较,程序在创建新对象实体之前,就知道类名了,连类名都知道了,为什么说是一无所知呢,求赐教另外,CButton应该没有IMPLEMENT_DYNCREATE吧
      

  10.   

    你可以用C++代码按照你的思路写一个CreateObject函数看看能不能写出来,用for循环,用数组。
    比如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源代码,这样是不符合类库的原则的,这样的设计会让类库变得很糟糕。
      

  11.   

    但是,《深入浅出MFC》的 第3章 “Dynamic Creation(动态生成)”这一节的Frame6范例程序里://Test Dynamic Creation
    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章还是这么做了?
      

  12.   

    sorry,前面排版有点乱,是下面这段:====================================================
    //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)的对象指针来容纳
    它绝对没有问题,但终不好总是如此吧!
    ====================================================
      

  13.   

    求教,看候捷在前面说的意思,应该是不用CObject* 指针指向新生成的对象,但是后面明明是用CObject*指针指向新生成的对象。那么就矛盾了,可以用什么方法实现用将要生成的对象类型的指针来指向新生成的对象吗?
      

  14.   

    宏是为了简单, 其实最后还是变成了循环的
    想一下, 如果你的类有20行代码, 你是打算在前面加了一行宏, 来实现动态生成
    还是愿意把宏展开成100行的代码加进你的类中?new classname当然是不行的, 所以用了CRuntimeClass::CreateObject
    在静态链表中遍历到符合的类, 得到该类的CRuntimeClass静态对象
    然后是每个类都有一个的m_pfnCreateObject, 这就创建了一个想要对象, 最后用CObject*来返回
    当你调用的时候, 返回CObject*是不是又变成了classname* ?