RT。Java语言中,Class.forName()可以根据指定的类名来产生相应的类实例。用C++该如何实现这种功能?谢谢!
解决方案 »
- org.apache.tools.zip.ZipOutputStream 压缩后能否按添加顺序?
- java 连接远程数据库问题
- 未知长度的字符串分割问题
- 怎么显示画板上的直线?在线等,急用
- JAVA如何输出这个图形
- 只是重写paint方法而不重写update方法,画图时有比较明显的闪烁
- 普通刻录光盘,我选则DVD格式,可以刻录成功吗?(刻录的文件很小)!!!!请高手!!!
- 用java applet怎样实现下面类似的功能,在现等,急需,请高手多多指点??
- mysql中文乱码,解决马上给分,在线等
- J2SE 5.0 和 J2SE 1.4 相比,语法和其他方面有什么区别?
- 郁闷啊~输入全班成绩,算出平均成绩、最高分、最低分等
- 本人初来乍到,望大家多多帮助!
rtti还有多很多实现手段,只是我也不太清楚。
=======================================
性欲好高啊
15w是今年一年吗?正题,不知道,java这个属于动态加载,c++很难实现吧?
//--------------------------------------------------------------------------------//
以下是第一个子类的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();
}
以下是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();
}
// 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;
}
接着前面的话题。基本的思路是:
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平台的依赖性。谢谢!