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

推荐订阅源

C
Cisco Blogs
Schneier on Security
Schneier on Security
T
Tor Project blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tenable Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Threat Research - Cisco Blogs
C
CERT Recently Published Vulnerability Notes
Security Latest
Security Latest
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
NISL@THU
NISL@THU
L
Lohrmann on Cybersecurity
Scott Helme
Scott Helme
Webroot Blog
Webroot Blog
Project Zero
Project Zero
Google Online Security Blog
Google Online Security Blog
The Last Watchdog
The Last Watchdog
Spread Privacy
Spread Privacy
Hacker News: Ask HN
Hacker News: Ask HN
PCI Perspectives
PCI Perspectives
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
W
WeLiveSecurity
Attack and Defense Labs
Attack and Defense Labs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
N
News | PayPal Newsroom
Help Net Security
Help Net Security
The Hacker News
The Hacker News
H
Heimdal Security Blog
O
OpenAI News
S
Security @ Cisco Blogs
N
News and Events Feed by Topic
Cyberwarzone
Cyberwarzone
Simon Willison's Weblog
Simon Willison's Weblog
G
GRAHAM CLULEY
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园 - 叶小钗
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Tailwind CSS Blog
大猫的无限游戏
大猫的无限游戏
A
Arctic Wolf
I
Intezer
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
Security Affairs
P
Proofpoint News Feed
S
Secure Thoughts
腾讯CDC
Google DeepMind News
Google DeepMind News
量子位
罗磊的独立博客

博客园 - 风满袖

如何进行有效的沟通(二) 如何进行有效的沟通(一) 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语句了。