Chinaunix首页 | 论坛 | 博客
  • 博客访问: 140108
  • 博文数量: 34
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 290
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-19 12:14
个人简介

码出快乐

文章分类
文章存档

2017年(1)

2009年(1)

2008年(32)

我的朋友

分类: C/C++

2008-09-23 23:55:13

一、VCL的原生方法简单易用:
1、 RegisterClass(__classid(TForm1));
    必须要先注册,否则FindClass找不到这个类。这一步可以创建一个注册单元,将所有要生成的Form注册进去。
2、 TClass aClass = FindClass("TForm1");
    TClass是从类名称生成实例的桥梁。
3、 TForm *Form = NULL;
    Application->CreateForm(aClass,Form);
    BCB用这种方法生成类实例。其Owner是Application , 当然也可以改变Owner。在生成实例这点,Delphi有着先天的优势,Delphi的代码更简单明了。

二、下面是BCB实现的一个简单的类工厂实现,不使用VCL的TClass机制 , 要较多的C++知识才好理解。(注:重要的是思路,而不是代码,参考一下<设计模式>会发觉这只是一个工厂模式而已)

#include
#include
//---------------------
typedef TComponent *(*TCreateMe)(TComponent* Owner);
struct TMyClassInfo
{
    AnsiString ClassName;
    TCreateMe  CreateMe;
    TMyClassInfo(AnsiString const &aClassName, TCreateMe aCreateMe) :
            ClassName(aClassName), CreateMe(aCreateMe) {}
};
bool operator == (TMyClassInfo const &A, AnsiString const &ClassName)
{
    return A.ClassName == ClassName;
}
//---------------------
class TMyClassFacatory // 单件模式的最简单实现:全局静态变量
{
    static std::vector ClassInfo;
public :
    static inline void RegisterClass(AnsiString const &ClassName, TCreateMe CreateMe)
    {
        // 这里没检查重名。
        ClassInfo.push_back(TMyClassInfo(ClassName, CreateMe));
// 本文转自 C++Builder研究 -
    }
    static TComponent* CreateObject(AnsiString const&ClassName, TComponent *Owner)
    {
        std::vector::iterator pos;
        pos = std::find(ClassInfo.begin(), ClassInfo.end(), ClassName);
        if(pos != ClassInfo.end())
            return pos->CreateMe(Owner);
        return NULL;
    }
    // 这行可不要,放在这里是为了完整性。
    static inline void DeleteObject(TComponent *x) { delete x; }
};
//---------------------
std::vector TMyClassFacatory::ClassInfo; // 为类的静态成员分配空间

// 下面的模板与宏是为了使用上更简单。

template
TComponent *_Class_CreateMe(TComponent *Owner){return new T(Owner);}

template
inline T *FactroyCreateObject(AnsiString const &ClassName, TComponent *Owner = NULL )
{
    return (T*)TMyClassFacatory::CreateObject(ClassName, Owner);
}

#define FactroyRegisterClass(T) \
    TMyClassFacatory::RegisterClass(#T, _Class_CreateMe);

// 用法更简单:
1、注册类:FactroyRegister(TForm1);
2、从类名生成实例
   TForm *pForm = FactroyCreateObject("TForm1", this);
   或:
   TForm *pForm = (TForm *)TMyClassFacatory::CreateObject("TForm1", this);
阅读(748) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~