RT。Java语言中,Class.forName()可以根据指定的类名来产生相应的类实例。用C++该如何实现这种功能?谢谢!

解决方案 »

  1.   

    java是动态加载的,可以这么做,c、c++是静态编译的,没法实现这个方式。
      

  2.   

    C++中可以用类似于MFC中的rtti机制来做,MFC中是用两个宏实现的,这两个宏的代码我看了一天也看不太懂,之后就不看了。
    rtti还有多很多实现手段,只是我也不太清楚。
      

  3.   

    你上网搜一下C和C++中的运行时类型识别(rtti),这方面我懂得不多。
      

  4.   

    楼上的,C++和.NET是不一样的东西,.NET更类似于Java
      

  5.   

    dlxu(Coding超过了15W行) ( ) 信誉:114    
    =======================================
    性欲好高啊
    15w是今年一年吗?正题,不知道,java这个属于动态加载,c++很难实现吧?
      

  6.   

    昨晚折腾了一个多钟头,最后用动态链接库的方式勉强解决。下面是代码,请指教:
    //--------------------------------------------------------------------------------//
    以下是第一个子类的DLL代码。
    //--------------------------------------------------------------------------------//
    // object.h
    #ifndef OBJECT_H
    #define OBJECT_Hclass Object
    {
       public:
          Object();
          virtual ~Object();
          virtual void run() = 0;   protected:   private:};#endif // OBJECT_H
    //--------------------------------------------------------------------------------//
    //object.cpp
    #include "object.h"Object::Object()
    {
    }Object::~Object()
    {
    }
    //--------------------------------------------------------------------------------//
    // firstclass.h
    #ifndef FIRSTCLASS_H
    #define FIRSTCLASS_H#include "object.h"class FirstClass : public Object
    {
       public:
          FirstClass();
          virtual ~FirstClass();
          virtual void run();   protected:   private:};#endif // FIRSTCLASS_H
    //--------------------------------------------------------------------------------//
    // firstclass.cpp
    #include <iostream>
    using namespace std;
    #include "firstclass.h"FirstClass::FirstClass()
    {
    }FirstClass::~FirstClass()
    {
    }void FirstClass::run()
    {
       cout << "This is the FirstClass." << endl;
    }
    //--------------------------------------------------------------------------------//
    // main.cpp       // DLL的主程序
    #include <windows.h>
    #include "object.h"
    #include "FirstClass.h"#ifdef BUILD_DLL
        #define DLL_EXPORT __declspec(dllexport)
    #else
        #define DLL_EXPORT
    #endifextern "C" Object * DLL_EXPORT createInstance();BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
    {
        switch (fdwReason)
        {
            case DLL_PROCESS_ATTACH:
                // attach to process
                // return FALSE to fail DLL load
                break;        case DLL_PROCESS_DETACH:
                // detach from process
                break;        case DLL_THREAD_ATTACH:
                // attach to thread
                break;        case DLL_THREAD_DETACH:
                // detach from thread
                break;
        }
        return TRUE; // succesful
    }Object * createInstance()             // 返回FirstClass类实例
    {
       return new FirstClass();
    }
      

  7.   

    //--------------------------------------------------------------------------
    以下是SecondClass类的实例。
    //--------------------------------------------------------------------------
    // secondclass.h
    #ifndef SECONDCLASS_H
    #define SECONDCLASS_H#include "object.h"class SecondClass : public Object
    {
       public:
          SecondClass();
          virtual ~SecondClass();
          virtual void run();   protected:   private:};#endif // SECONDCLASS_H
    //--------------------------------------------------------------------------
    // secondclass.cpp
    #include <iostream>
    using namespace std;
    #include "secondclass.h"SecondClass::SecondClass()
    {
    }SecondClass::~SecondClass()
    {
    }/** @brief run
      *
      * @todo: document this function
      */
    void SecondClass::run()
    {
       cout << "This is the SecondClass." << endl;
    }
    //--------------------------------------------------------------------------
    // main.cpp        // SecondClass类的DLL主程序
    #include <windows.h>
    #include "..\object.h"
    #include "SecondClass.h"#ifdef BUILD_DLL
        #define DLL_EXPORT __declspec(dllexport)
    #else
        #define DLL_EXPORT
    #endifextern "C" Object * DLL_EXPORT createInstance();BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
    {
        switch (fdwReason)
        {
            case DLL_PROCESS_ATTACH:
                // attach to process
                // return FALSE to fail DLL load
                break;        case DLL_PROCESS_DETACH:
                // detach from process
                break;        case DLL_THREAD_ATTACH:
                // attach to thread
                break;        case DLL_THREAD_DETACH:
                // detach from thread
                break;
        }
        return TRUE; // succesful
    }Object * createInstance()            // 创建SecondClass类的实例
    {
       return new SecondClass();
    }
      

  8.   

    //-----------------------------------------------------------------------------
    // loadclass.h
    #ifndef LOADCLASS_H_INCLUDED
    #define LOADCLASS_H_INCLUDED#include "object.h"typedef Object *( *CreateInstance)();#endif // LOADCLASS_H_INCLUDED
    //-----------------------------------------------------------------------------
    // 演示程序代码
    //-----------------------------------------------------------------------------
    #include <windows.h>
    #include <iostream>
    #include <string>
    using namespace std;
    #include "loadclass.h"
    #include "object.h"extern Object *loadClass(char className[]);int main()
    {
    Object *instance; instance = loadClass("FirstClass");
    instance->run(); instance = loadClass("SecondClass");
    instance->run(); return 0;
    }Object *loadClass(char className[])        // 这个函数可以根据className字符串创建任何Object类的子类。
    {
       string dllName;
       dllName = string(className) + ".dll";          // 根据类名字符串合成类的DLL文件名
       HINSTANCE hdlDll = LoadLibrary(dllName.c_str());       // 装载类的DLL
       if (!hdlDll)
          return NULL;
       CreateInstance createInstance = (CreateInstance)GetProcAddress(hdlDll, "createInstance");         // 装载DLL中的createInstance()接口
       if (!createInstance)
       {
          FreeLibrary(hdlDll);
          return NULL;
       }
       Object *instance = createInstance();       // 创建指定的类实例   return instance;
    }
      

  9.   

    不好意思,由于CSDN限制连续恢复次数不能超过3次,只好换个帐户来登陆。
    接着前面的话题。基本的思路是:
    1、类族中所有的子类都必须继承于一个单一的公有类(例如Object,代码参见前面的object.h/cpp);
    2、每个子类的实现代码放在他自己的DLL中,DLL文件名应该与子类名相同(借鉴了Java的思路);
    3、子类DLL中必须实现Object * DLL_EXPORT createInstance()这个函数,这个函数会创建自己所在DLL中的子类的实例,并将此实例返回。
    4、Object *loadClass(char className[])函数的输入参数类族中任意类的类名。他会利用类名字符串合成指定的子类所在的DLL文件名,然后调用dll装载函数来装载子类DLL,并找出DLL中用于创建该子类对象的createInstance函数,最后调用这个函数创建子类对象。这算是对Java的类装载机制的一个非常简陋的模拟吧。现在的实现代码的最大的缺点在于子类DLL和loadClass的实现代码严重依赖于Windows平台。各位高人不知是否有更好的主意能够使这段代码摆脱OS平台的依赖性。谢谢!