激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C++如何動態的生成對象詳解

C++如何動態的生成對象詳解

2021-04-29 15:22朝十晚八 C/C++

C++是不支持根據類名動態地生成對象的,比如從一個文本文件中讀取類名然后構造一個對象.主要原因是沒有豐富的動態元信息,沒有單根類庫。那么下面這篇文章就來給大家介紹C++是如何動態的生成對象,有需要的朋友們可以參考借

前言

可能說起C++大多數人都覺著難學,其實我也是這么覺著的,在這個移動端火到爆的時代,我都想改行了,移動端做東西那都是現有的第三方庫,拿來就可以用,而且穩定性好,開發速度快,而且最關鍵的是出東西。再談一談動態生成對象,為什么強大的C++不支持呢?想用這樣功能的人都必須自己實現一套這樣的邏輯。

實現理由

有時候開發真是有些矛盾,例如:1、實現一個功能可以使用大量相似的代碼、也可以使用模板,那我們怎么選擇呢? 2、如果實現一個類之后,他有大量的屬性,而且這些屬性都需要set和get方法,那么我們還是要Ctrl +C和Ctrl+V嗎?如果有好多這樣的類,還是Ctrl+C和Ctrl+V嗎?對于第一個問題,一個力求上進開發人員,我相信他會選擇模板,第二個問題的答案,也就是我們這篇文章所需要講到的東西,動態生成對象、序列化和反序列化。

實現思路

其實這個功能實現起來代碼量還是比較少的,就是使用大量的宏和工廠模式

1、寫一個工廠類,專門用于生成對象

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef void * (* CreateClass)(void);
 
class CClassFactory
{
public:
 static CClassFactory & IntanceFactory();
 
public:
 void * CreateObject(const std::string & className);
 void RegistClass(const std::string & name, const CreateClass & method);
 
private:
 std::map<std::string, CreateClass> m_classMap;
};

2、然后在寫一個方便類,這個類僅僅是為了注冊方便,當這個類被聲明的時候,即注冊一個類到工廠中

?
1
2
3
4
5
6
7
8
class CDynamicClass
{
public:
 CDynamicClass(const std::string & name, const CreateClass & method)
 {
 CClassFactory::IntanceFactory().RegistClass(name, method);
 }
};

3、2個關鍵的宏,這兩個宏一個是用于CDynamicClass靜態對象的,一個是用于初始化CDynamicClass對象的,作用請看上一小節,呵呵呵,其實就是注冊宏的參數類到工廠

?
1
2
3
4
5
6
#define DECLARE_CLASS(className)\
std::string className##Name;\
static CDynamicClass * className##Namedc;
 
#define IMPLEMENT_CLASS(className)\
CDynamicClass * className::className##Namedc = new CDynamicClass(#className, className::Instance);

4、2個屬性宏,ACCESS_INTERFACE宏用于注冊屬性的相關接口,ACCESS_REGISTER宏是把屬性名字和對象的屬性調用接口記錄起來,方便以后設置屬性

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define ACCESS_INTERFACE(classType, type, name, describe)\
public:\
 std::string m_Describe##name = #describe;\
 inline static void Set##name(CBaseClass * cp, void * value){\
 classType * tp = (classType *)cp;\
 tp->m_##name = *(type *)value;\
 }\
 inline type Get##name(void) const {\
 return m_##name;\
 }\
 inline std::string Get##name##Describe(){ \
 return m_Describe##name;\
 }
 
#define ACCESS_REGISTER(name)\
 m_propertyMap.insert({ #name, Set##name });

5、基類,所有對象的基類,m_propertyMap成員是存儲屬性和屬性對于的set接口對

?
1
2
3
4
5
6
7
8
9
10
11
class CBaseClass
{
public:
 CBaseClass() {}
 virtual ~CBaseClass() {}
 
public:
 std::map<std::string, SetValueProperty> m_propertyMap;
 
private:
};

測試類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class CHelloClass : public CBaseClass
{
public:
 DECLARE_CLASS(CHelloClass);
 ACCESS_INTERFACE(CHelloClass, int, Age, "年齡")
 ACCESS_INTERFACE(CHelloClass, int, Sex, "性別")
 
public:
 CHelloClass();
 virtual ~CHelloClass();
 
public:
 static void * Instance();
 
public:
 virtual void RegistProperty( );
 
protected:
 int m_Age = 0;
 int m_Sex = 0;
};

CHelloClass類是一個測試類,用于測試第三節所寫的動態生成對象是否正確,RegistProperty接口里邊是對屬性的注冊

1、測試main函數

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main(int argc, char *argv[])
{
 QCoreApplication a(argc, argv);
 
 
 CHelloClass * pVar = (CHelloClass*)CClassFactory::IntanceFactory().CreateObject("CHelloClass");
 if (pVar)
 {
 int pAge = 2;
 int pSex = 1;
 
 pVar->m_propertyMap["Age"](pVar, &pAge);
 pVar->m_propertyMap["Sex"](pVar, &pSex);
 
 std::cout << pVar->GetAgeDescribe() << pVar->GetAge() << std::endl;
 std::cout << pVar->GetSexDescribe() << pVar->GetSex() << std::endl;
 }
 
 return a.exec();
}

2、效果結果截圖

C++如何動態的生成對象詳解

圖1 CHelloClass測試結果

序列化和反序列化

本片文章主要講解的是動態生成對象,并沒有打算深入的去剖析系列化和反序列化的模塊,demo中也有一小部分的序列化代碼,主要是使用tinyxml2來讀文件,代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void DynamicObject::Deserialize()
{
 tinyxml2::XMLDocument doc;
 if (tinyxml2::XML_NO_ERROR == doc.LoadFile("D:\\example\\paint\\DynamicCreateObject\\test.xml"))
 {
  if (tinyxml2::XMLNode * rootNode = doc.FirstChildElement("Ojbectlist"))
  {
   const char * rootText = rootNode->ToElement()->Attribute("name");
 
   tinyxml2::XMLElement * element = rootNode->FirstChildElement("Object");
   while (element)
   {
    const char * objectName = element->Attribute("name");
    tinyxml2::XMLElement * propertyElement = element->FirstChildElement("Property");
    while (propertyElement)
    {
     const char * propertyName = propertyElement->Attribute("name");
     const char * propertyValue = propertyElement->Attribute("value");
    }
    tinyxml2::XMLNode * nextNode = element->NextSibling();
    if (nextNode == nullptr)
    {
     break;
    }
    element = nextNode->ToElement();
   }
  }
 }
}

說到對象序列化,我就覺得有一個問題比較難搞定,對象包含對象,也就是遞歸序列化,如果涉及到判斷遞歸那么我們可能還需要自己實現一套結構,用于表示當前對象是否包含其他對象,是否需要繼續遞歸序列化的問題。后面有機會我會對此問題在專門做一篇文章加以解釋。

demo下載地址

C++動態生成對象

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

原文鏈接:http://www.cnblogs.com/swarmbees/p/6033666.html

延伸 · 閱讀

精彩推薦
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
主站蜘蛛池模板: 99精品电影 | 久在线播放 | 久久久一区二区三区精品 | 九九热在线免费观看视频 | 亚洲片在线观看 | 欧美日本一 | 国产免费一区二区三区最新不卡 | 羞羞视频免费网站 | 日韩精品羞羞答答 | 精品黑人一区二区三区国语馆 | 久久福利国产 | 91国内精品久久久久免费影院 | 久久视频精品 | 成人不卡 | 国产成人精品一区在线播放 | 成人男女啪啪免费观看网站四虎 | 精品国产一区二区三区久久久蜜月 | 国产亚洲精品成人 | 免费日韩片 | 欧美日韩国产中文字幕 | 亚洲视频在线网 | 久久精品视频16 | 一级免费视频 | 国产91影院 | 91精品国产日韩91久久久久久360 | 在线中文字幕不卡 | 亚洲国产精品久久久久久久久久久 | 欧美国产一级片 | 欧美成年私人网站 | 九九热精品视频在线免费观看 | 欧美3p激情一区二区三区猛视频 | 美女视频黄a视频免费全过程 | 国产一区二区免费 | 国产一级免费在线视频 | 久草在线资源福利站 | 久久精品性视频 | 免费黄色大片在线观看 | 久久久tv | xxxx hd video 69 | 一级免费 | 国产日韩久久久久69影院 |