自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C++動(dòng)態(tài)創(chuàng)建對(duì)象應(yīng)用技術(shù)講解

開發(fā) 后端
C++動(dòng)態(tài)創(chuàng)建對(duì)象的方式有很多種,我們可以通過對(duì)這篇文章的解讀充分掌握這方面的知識(shí),以方便我們將來的實(shí)際編程。

C++是一款功能強(qiáng)大的基于C語言的計(jì)算機(jī)編程語言。它不但能支持各種C語言的功能,還可以對(duì)包括面向?qū)ο笤趦?nèi)的各種程序設(shè)計(jì)風(fēng)格的支持。我們今天會(huì)為大家詳細(xì)介紹一下有關(guān)C++動(dòng)態(tài)創(chuàng)建對(duì)象的一些應(yīng)用技巧。#t#

Native C++是不支持根據(jù)類名的C++動(dòng)態(tài)創(chuàng)建對(duì)象,比如從一個(gè)文本文件中讀取類名然后構(gòu)造一個(gè)對(duì)象.主要原因是沒有豐富的動(dòng)態(tài)元信息,沒有單根類庫。然而可以用幾種技術(shù)進(jìn)行實(shí)現(xiàn)。如果是類似Spring那樣的根據(jù)配置文件運(yùn)行時(shí)產(chǎn)生實(shí)現(xiàn)某個(gè)接口的對(duì)象,那么在Windows中至少有三種辦法:

1. LoadLibrary + GetProcAdress。這個(gè)不用多解釋,可以把DLL和Proc的名字動(dòng)態(tài)傳入。

2. COM,根據(jù)動(dòng)態(tài)獲得的CLSID調(diào)用GetClassObject獲得IClassFactory接口,然后CreateInstance?;蛘咧苯诱{(diào)用CoCreateInstance/CoCreateInstanceEx動(dòng)態(tài)產(chǎn)生CoClass。

3. MFC dynamic creation。

Native C++不能在運(yùn)行時(shí)編譯代碼并即時(shí)產(chǎn)生對(duì)象,所以JIT的動(dòng)態(tài)生成在C++里做不到。在MFC中,可以參考,總結(jié)如下:

MFC的C++動(dòng)態(tài)創(chuàng)建對(duì)象可能是最容易使用的方案。查了一下MFC中RTCI的實(shí)現(xiàn),總結(jié)一下:

DECLARE_ DYNCREATE(class_name)宏展開后是如下形式:

假設(shè)class_name是“CMyClass”

  1. public:  
  2. static CRuntimeClass classCMyClass;  
  3. virtual CRuntimeClass* GetRuntimeClass() const;  
  4. static CObject* CreateObject(); 

這幾行會(huì)被加入到CMyClass類的聲明中。

IMPAEMENT_DYNCREATE(classname,base_classname)宏定義比較復(fù)雜,這個(gè)宏展開后類似如下的樣子:

  1. AFX_DATADEF CRuntimeClass CMyClass::classCMyClass = {  
  2. "CMyClass",sizeof(CMyClass),0xFFFF,NULL,RUNTIME_CLASS(CObject),NULL};  
  3. static const AFX_CLASSSINIT _init_CMyClass(&CMyClass::classCMyClass);  
  4. CRuntimeClass* CMyClass::GetRuntimeClass() const  
  5. {  
  6. Return & CMyClass::classCMyClass;  
  7. }  
  8. CObject* PASCAL CMyClass::CreateObject()  
  9. {  
  10. return new CMyClass;  

這個(gè)宏做了如下3件事情:

1.初始化CRuntimeClass類型的成員變量classCMyClass

2.創(chuàng)建靜態(tài)AFX_CLASSINIT結(jié)構(gòu),該結(jié)構(gòu)如下:

  1. Struct AFX_CLASSINIT  
  2. {AFX_CLASSINIT(CRuntimeClass* pNewClass);}; 

這個(gè)步驟地主要作用是把CMyClass::classCMyClass添加到MFC的一個(gè)內(nèi)部鏈表中去。

3.覆蓋GetRuntimeClass(),以返回成員變量classCMyClass的地址。

  1. RUNTIME_CLASS宏展開后如下:  
  2. (&class_name::class##class_name) 

C++動(dòng)態(tài)創(chuàng)建對(duì)象的時(shí)候,調(diào)用CRuntime::CreateObject()方法。

這個(gè)方法實(shí)際上會(huì)去調(diào)用CRuntime中的一個(gè)成員指針,這個(gè)指針指向的正是CMyClass::CreateObject()方法。

由上可見,RuntimeClass宏可接受字符串作為參數(shù),但是,仍然需要在編譯時(shí)定義好需要?jiǎng)討B(tài)創(chuàng)建的對(duì)象類型,上文例子中為CMyClass。通過MFC的這個(gè)特性,理論上還是可以從配置文件中讀取文本,然后按照文本指定的類型C++動(dòng)態(tài)創(chuàng)建對(duì)象,但必須要求在編譯時(shí)就存在這種類型,不能像動(dòng)態(tài)語言那樣無限制的擴(kuò)展。另外CMyClass必須繼承自CObject。

責(zé)任編輯:曹凱 來源: 博客園
相關(guān)推薦

2011-07-20 17:23:29

C++持久對(duì)象

2013-05-27 15:38:37

Java對(duì)象C++

2010-02-03 10:11:17

C++動(dòng)態(tài)數(shù)組

2010-02-02 17:20:44

C++ switch-

2010-02-05 13:52:04

C++資源管理

2010-02-01 17:37:35

C++調(diào)用C鏈接庫

2011-05-30 09:17:18

光纖

2023-01-06 19:02:23

應(yīng)用技術(shù)

2015-06-02 10:08:51

布線技術(shù)光纖

2010-02-03 17:06:36

C++對(duì)象復(fù)制

2010-02-04 17:49:04

C++參數(shù)傳遞

2011-05-18 17:15:45

2010-03-11 15:01:52

Python源碼

2010-03-10 13:59:40

Python異常處理

2010-04-14 16:24:44

寬帶無線接入

2015-09-01 10:14:21

機(jī)房直冷優(yōu)化

2010-02-01 15:01:34

C++拋出異常

2011-07-15 00:47:13

C++多態(tài)

2010-02-24 16:52:59

WCF支持WebGet

2015-11-30 11:14:59

C++對(duì)象池自動(dòng)回收
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)