惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 风满袖

如何进行有效的沟通(二) 如何进行有效的沟通(一) SOA——概念 (转)Locale 详解 A XMLBean Tip 在Weblogic8.1.4服务器上安装Alphablox8.4 BI相关的术语 开源BI系统简述 如何收集项目需求 Prefactoring——Guidelines Prefactoring——Introduction MVP——Model-Viewer-Presenter Success/Failure Criteria for Software Projects AJAX Secutiry and AJAX Applications Accessible -- Many Tutorials and Articles A NHibernate Helper Kit Apache——Config WebDAV 3D Desktop Some Funny Development Methodologies -- XXX Driven Development Why I hate Web 2.0/AJAX? Here are some reasons...
Create C++ Object Dynamically
风满袖 · 2006-07-12 · via 博客园 - 风满袖

Create C++ Object Dynamically

Introduction

C++不像C#和Java那样具有反射的能力,通常不能根据任意一个class name来创建该classinstance。但我们知道在MFC中,任何继承了CObject的类都可以根据其名字来创建实例,它是使用了一些宏。而我从来就不喜欢使用大把的宏,虽然有的时候宏可能比较方便,可能对某些人来说也更美观。

原理很简单——定义一个基类,维护一个其派生类信息(包括派生类的名字和创建实例的函数指针)的列表,而派生类在程序运行的最初始阶段就向基类注册其信息。

Design & Implementation

Base Class——   DynBase

Derived Class—— Any Class Derived from DynBase

DynBase

DynBase.h

#pragma once

#include <map>

#include <string>

class DynBase;

struct ClassInfo;

bool Register(ClassInfo* ci);

typedef DynBase* (*funCreateObject)();

//Assistant class to create object dynamicly

struct ClassInfo

{

public:

       string Type;

       funCreateObject Fun;

       ClassInfo(string type, funCreateObject fun)

       {

              Type = type;

              Fun = fun;

              Register(this);

       }

};

//The base class of dynamic created class.

//If you want to create a instance of a class ,you must let

//the class derive from the DynBase.

class DynBase

{

public:

       static bool Register(ClassInfo* classInfo);

       static DynBase* CreateObject(string type);

private:

       static std::map<string,ClassInfo*> m_classInfoMap;

};

DynBase.cpp

#include "stdafx.h"

#include "DynBase.h"

std::map< string,ClassInfo*> DynBase::m_classInfoMap = std::map< string,ClassInfo*>();

bool DynBase::Register(ClassInfo* classInfo)

{

       m_classInfoMap[classInfo->Type] = classInfo;

       return true;

}

DynBase* DynBase::CreateObject(string type)

{

       if ( m_classInfoMap[type] != NULL )

       {

              return m_classInfoMap[type]->Fun();

       }

       return NULL;

}

bool Register(ClassInfo* ci)

{

       return DynBase::Register(ci);

}

Derived Class

DerivedClass.h

class DerivedClass : public DynBase

{

public:

       virtual ~ DerivedClass ();

       DerivedClass ();

       static DynBase* CreateObject(){return new DerivedClass ();}

private:

       static ClassInfo* m_cInfo;

};

DerivedClass.cpp

#include "stdafx.h"

#include "DynBase.h"

#include "DerivedClass.h"

DerivedClass::~ DerivedClass ()

{

       // ToDo: Add your specialized code here and/or call the base class

}

DerivedClass:: DerivedClass ()

{

}

ClassInfo* DerivedClass::m_cInfo = new ClassInfo(DerivedClass,(funCreateObject)( DerivedClass::CreateObject));

How to Use

int _tmain(int argc, _TCHAR* argv[])

{

       DerivedClass * instance = (DerivedClass *)DynBase::CreateObject(DerivedClass);

    //do something

       system("pause");

      return 0;

}

Postscript

C++虽然没有反射的功能也能在一定的情况下根据类名来动态创建其实例,虽然使用了全局静态函数以及静态成员这样不是很理想的方法——可也只能用这样的方法了。在我们使用工厂模式的时候,可以使用这样的方法来创建某产品的实例了,而不是使用大把的switch-case语句了。