C++ 反射機制的簡單實現

C++并不支持反射機制,只能自己實現。

如果需要實現字字符串到函數到映射,一定要使用到函數指針

簡單實現反射機制,根據字符串來構造相應到類。主要有以下幾點:

(1) 可以使用map保存字符從到函數指針到映射。

(2) 工廠類提供字符串與函數指針到注冊關系。

(3) 工廠模式根據不同到字符串構造不同到類對象。

?

代碼示例:

class_factory.h

 1 #ifndef __CLASSFACTORY_
 2 #define __CLASSFACTORY_
 3 
 4 #include <iostream>
 5 #include<string>
 6 #include<map>
 7 
 8 //定義函數指針
 9 typedef void* (*create_fun)();
10 
11 class ClassFactory{
12 public:
13     ~ClassFactory() {}; 
14 
15     //根據類注冊時的名字, 創建類實例, 并返回
16     void* getClassByName(std::string name){
17         std::map<std::string, create_fun>::iterator it = my_map.find(name);
18         if (it == my_map.end()) { return NULL; }
19 
20         create_fun fun = it->second;
21         if (!fun) { return NULL; }
22 
23         return fun();
24     }   
25 
26     //注冊類名稱與指針函數到映射關系
27     void registClass(std::string name, create_fun fun){
28         my_map[name] = fun;
29     }   
30 
31     //單例模式
32     static ClassFactory& getInstance(){
33         static ClassFactory fac;
34         return fac;
35     }   
36 
37 private:
38     ClassFactory() {};  //私有
39     std::map<std::string, create_fun> my_map;
40 }; 
41 
42 #endif

?test.h

 1 #ifndef __TEST_H
 2 #define __TEST_H
 3 
 4 #include <iostream>
 5 
 6 class Test{
 7 public:
 8     Test(){ std::cout << "call Test Constructor fun" << std::endl; }
 9     ~Test(){ std::cout << "call Test Destructor fun" << std::endl; }
10     void print(){ std::cout << "call Test print fun" << std::endl; }
11 };
12 
13 void* create_Test(){
14     Test *t = new Test;
15     return (t == NULL)? NULL:t;
16 }
17 
18 #endif

main.cpp

 1 #include "test.h"
 2 #include "class_factory.h"
 3 
 4 int main(){
 5     //注冊
 6     ClassFactory::getInstance().registClass("Test", create_Test);
 7 
 8     //獲取類對象
 9     Test *t = (Test*)ClassFactory::getInstance().getClassByName("Test");
10     if (!t){
11         std::cout << "get instnce Test err;" << std::endl;
12         return 1;
13     }   
14     
15     t->print();
16     delete t;
17     return 0;
18 }

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282465.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282465.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282465.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微軟與 Canonical 合作,將 systemd 引入 WSL

微軟和 Canonical 聯合宣布&#xff0c;systemd 現在可以在 Windows Subsystem for Linux&#xff08;WSL2&#xff09;中運行了&#xff0c;此舉可以讓用戶在 Windows 設備上獲得更加全面的 Linux 體驗。systemd 的作者 Lennart Poettering 在 7 月份離開紅帽并加入了微軟&…

vsftpd配置

1.) yum install -y vsftpd 2.) useradd -g ftp -s /sbin/nologin afcupload (默認生成/home/afcupload, 可使用 -d參數自定義主目錄生成位置) 3.) passwd afcupload 4.) chgrp -R ftp afcupload 5.) chown -R afcupload:ftp afcupload 6.) chmod -R 700 afcupload 4.) 修…

2017.9.6數學

集合&#xff1a;一個可以代表一類事物或數據的代詞。&#xff08;個人定義&#xff09; &#xff08;其內容帶有輔助功效【個人記不下來】&#xff09;自然數&#xff1a;所有的非負整數。 有理數&#xff1a;是可以用正數和分數代表的數。實數&#xff1a;包括有理數和無理數…

.NET 反向代理-YARP 根據域名轉發

編者&#xff1a;fastgithub 就是基于YARP使用域名做轉發邏輯的。 前段時間發布過一個關于 YARP 的簡單介紹&#xff0c;感興趣的小伙伴恭請移步看看 .NET 反向代理-YARP 作為反向代理&#xff0c;必不可少的當然是根據域名代理轉發啦&#xff0c;毫無疑問&#xff0c;YARP…

第一個python小游戲

guess int(input("猜一猜寶寶心目中的數字是多少:")) secret 8 while guess !secret:guess int(input("哎呀猜錯了,重新猜一猜寶寶心目中的數字是多少:"))if guess secret:print("你真厲害,居然猜對了")print("哼,猜對了也不給你獎勵&q…

理論實踐:循序漸進理解AWR細致入微分析性能報告

1. AWR 概述 Automatic Workload Repository(AWR) 是10g引入的一個重要組件。在里面存貯著近期一段時間內&#xff08;默認是7天&#xff09;數據庫活動狀態的詳細信息。 AWR 報告是對 AWR 視圖進行查詢而得到的一份自動生成的報告。可以通過下面的腳本手工得到一份 AWR 報告。…

java 動態代理

動態代理 Proxy動態代理是基于實現接口的,被代理類實現了某個功能接口, 代理類實現invocationHandler 接口重寫invoke(Object proxy, Method method , class 代理類) 用Proxy.newProxyInstance(類加載器, 被代理類實現的接口的集合, invocationhandler 的實現類)來創建代理類對…

mysql sql語句書寫之面試部分

要求一 :查詢時,將用戶的手機號碼(比如1331234567)顯示為133***4567 這是在交流群里看到別人發的一個面試題,我本人非常反感直接在查詢時進行處理數據的,查詢出來再處理不好嗎,但是面試題要求是這樣. 這里,簡單的寫了兩個表關聯查詢,然后把手機號碼進行處理顯示出來select a.ui…

Linux中寫入ISO鏡像

1、查看U盤標識 fdisk -l2、寫入鏡像到U盤 sudo dd if/home/***.iso of/dev/sdb轉載于:https://www.cnblogs.com/katzepunk/p/7492813.html

Linux上用戶之間對話

Linux上用戶之間對話 昨天想在CentOS7上與另外一個用戶對話&#xff0c;但把命令忘記了&#xff0c;特此記錄下來。 Write命令 write命令是單向發送一條消息給同機器的Linux用戶。首先通過who命令查看誰在線。 root tty7 2017-03-15 14:38 (:0) root pts/20 …

Redis --數據類型 [1]

一 string 類型 (最簡單常用的類型) string是redis最基本的類型&#xff0c;你可以理解成與Memcached一模一樣的類型&#xff0c;一個key對應一個value。二 Hash類型(哈希) Redis hash是一個string類型的field和value的映射表&#xff0c;hash特別適合用于存儲對象。三 List(列…

KestrelServer詳解[3]: 自定義一個迷你版的KestrelServer

和所有的服務器一樣&#xff0c;KestrelServer最終需要解決的是網絡傳輸的問題。在《KestrelServer詳解[2]: 網絡連接是如何創建的&#xff1f;》&#xff0c;我們介紹了KestrelServer如何利用連接接聽器的建立網絡連接&#xff0c;并再次基礎上演示了如何直接利用建立的連接接…

c# 文件下載

這樣的下載方式 減少服務器的壓力&#xff0c; 還有一種省懶勁的方式&#xff1a;后端在iis上配置一個虛擬目錄&#xff0c;然后讓前端自己拼url地址下載&#xff0c; 這個東西是給后期其他工作人員埋坑&#xff0c;哈哈。 本帖原文轉自與 農碼一生轉載于:https://www.cnbl…

Redis -- 基礎操作 [2]

一 獲取redis當前數據庫符合條件鍵名 [keys pattern]二 設置string形式key-value [set key value]三 獲取存儲在指定 key 中字符串的子字符串 [GETRANGE KEY start end]四 刪除指定鍵值對 [del key]五 為給定key設置過期時間 [Expire KEY SECONDS]注: Expireat KEY TIMESTAMP 同…

Centos7作為VNCserver,本地使用VNCViewer連接

1.概念 VNC是一個遠程連接工具 VNC is used to display an X windows session running on another computer. Unlike a remote X connection, the xserver is running on the remote computer, not on your local workstation. Your workstation ( Linux or Windows ) is only …

SQL Server CONVERT() 日期轉換為新數據類型的 通用函數

http://www.w3school.com.cn/sql/func_convert.asp轉載于:https://www.cnblogs.com/renzhituteng/p/6665569.html

在URL中實現簡易的WebAPI驗簽

本文主要介紹一種與微信公眾平臺對接方式類似的&#xff0c;為 AspNetCore 提供的一種簡易的 WebAPI 簽名驗證中間件。本文相關源碼和案例已開源&#xff0c;地址&#xff1a;https://github.com/sangyuxiaowu/SignAuthorization原理說明簡易的 API url 簽名驗證中間件&#xf…

Redis -- Hash(哈希) [3]

Redis Hash 是一個string類型的field和value的 映射表 &#xff0c;hash特別適合用于存儲對象。 注 : Redis 中每個 hash 可以存儲 232 - 1 鍵值對&#xff08;40多億&#xff09;。 比如這樣:注:在此,首先推薦一款redis可視化工具 https://redisdesktop.com/download , 是非常…

HBuilder 打包流程

1.運行HBuilder---百度搜索HBuilder&#xff0c;官網下載安裝包&#xff0c;解壓&#xff0c;運行HBuilder.exe。注冊賬號&#xff0c;并登陸 2.新建app---在左邊右鍵&#xff0c;選擇新建APP&#xff0c;或者&#xff0c;點擊中間的新建app 3.在彈出的窗口&#xff0c;填入應用…