vc2010根据类名动态创建类实例

来源:互联网 发布:win远程控制mac 编辑:程序博客网 时间:2024/06/03 18:04

      根据类名动态加创建类,是已经知道基类(相当于java里的接口),然后根据子类(相当于java里的实现类)的类名来创建子类实例和调用子类,子类类名一般是执行时动态指定,比如读配置文件。
      动态创建类实例也有替代的解决方案,就是通过加if else判断,根据类名new 子类实例出来,但是这种方法每新增一个子类,都需要来改动实例取得的代码,所以在子类很多并经常增加的情况下,并不可取。
     根据类名动态加创建类,要求基类是CObject的子类。然后子类需要加上 DECLARE_SERIAL 和 IMPLEMENT_SERIAL。
     下面以一个实际的简单例子来说明。基类的功能是根据传入字符串,输出新的字符串;不同的子类,输出的字符串会不一样。

1. 基类头文件 ClassLoaderTest.h 内容如下:
#pragma once
#include "afx.h"
class CClassLoaderTest :
public CObject
{
public:
CClassLoaderTest(void);
~CClassLoaderTest(void);
       //需要在子类中实现的方法,不同的子类,会有不同的实现
virtual void Print(CString msg)=0;
};

2. 基类类文件 ClassLoaderTest.cpp 内容如下,只是默认创建,无需改动:

#include "stdafx.h"
#include "ClassLoaderTest.h"

CClassLoaderTest::CClassLoaderTest(void)
{
}

CClassLoaderTest::~CClassLoaderTest(void)
{
}

3. 子类头文件 ClassLoaderTestImpl.h

#pragma once
#include "classloadertest.h"
class CClassLoaderTestImpl :
public CClassLoaderTest
{
DECLARE_SERIAL(CClassLoaderTestImpl) //这个必须加
public:
CClassLoaderTestImpl(void);
~CClassLoaderTestImpl(void);
        //父类虚方法的实现
void Print(CString msg);
};


4. 子类类文件ClassLoaderTestImpl.cpp

#include "stdafx.h"
#include "ClassLoaderTestImpl.h"
IMPLEMENT_SERIAL(CClassLoaderTestImpl,CObject,1) //这个必须加

CClassLoaderTestImpl::CClassLoaderTestImpl(void)
{
}

CClassLoaderTestImpl::~CClassLoaderTestImpl(void)
{
}

void CClassLoaderTestImpl::Print( CString msg )
{
CString newMsg=L"ClassLoadTest输出:"+msg;
MessageBox(NULL,newMsg,L"CClassLoaderTestImpl",MB_OK);
}

5. 动态创建类 头文件 ClassLoader.h
#pragma once
class CClassLoader
{
public:
CClassLoader(void);

~CClassLoader(void);
        //根据类名返回类实例
        CObject* LoadClass(CString className);
};


6. 动态创建类 类文件 ClassLoader.cpp
#include "stdafx.h"
#include "ClassLoader.h"

CClassLoader::CClassLoader(void)
{
}

CClassLoader::~CClassLoader(void)
{
}

CObject* CClassLoader::LoadClass( CString className )
{
CRuntimeClass* pClass = CRuntimeClass::FromName(className);
if (pClass == NULL)
{
return NULL;
}
CObject* pObject = pClass->CreateObject();
return pObject;
}

7. 测试代码
        CString className=L"CClassLoaderTestImpl";
        CClassLoader classLoader;
CClassLoaderTest * pClassLoaderTest=(CClassLoaderTest *)classLoader.LoadClass(  className );
if(! pClassLoaderTest){
MessageBox(NULL,L"ClassLoader加载类CClassLoaderTestImpl失败",L"CClassLoader",MB_OK);
}else{
pClassLoaderTest->Print(L"ClassLoader加载类CClassLoaderTestImpl成功!");
delete pClassLoaderTest;
}

以上例子在vc2010 Unicode环境测试通过。
通过以上的例子,我们已经了解如何根据类名创建一个类实例了。

    不过我在实际使用中发现,如果有使用VC2010的Framework and References引用其他项目的情况下,并且类的定义又是放在被引用的项目里,会有动态创建类实例失败的情况。如果有谁知道如何解决这个问题,请一定告诉我,谢谢!




原创粉丝点击