C++ 实现类 反射 类名获取对象


实现代码

主要还用到 C++11提供了对匿名函数的支持,称为Lambda函数(也叫Lambda表达式) 实现直接在插入的时候:函数指针直接用Lambda表达式 CReflectRegister.h

#pragma once
#include <string>
#include <map>
#include "CReflectBase.h"

//把类名添加到map
#define ADD_CLASS_REGISTER(className) g_ReflectRegisterMap.insert(std::make_pair(#className, []() -> CReflectBase* {
          
   return new className; }))

//创建对象的函数指针
typedef CReflectBase* (*PF_CREATE_OBJECT)();

//类名创建对象
CReflectBase* ClassNameCreateObj(std::string _ClassName);

//初始化类名注册,
void InitClassReflect();

CReflectRegister.cpp

#include "CReflectRegister.h"
#include "CA.h"
#include "CB.h"

//定义一个全局的map保存字符串到动态类生成的函数指针的映射表
std::map<std::string, PF_CREATE_OBJECT> g_ReflectRegisterMap;

CReflectBase* ClassNameCreateObj(std::string _ClassName)
{
          
   
    //先判断是否已经初始化,不支持线程安全,如果需要涉及,该初始化请放到主线程中或者加个临界锁
    if (0 == g_ReflectRegisterMap.size())
    {
          
   
        InitClassReflect();
    }
    auto itr = g_ReflectRegisterMap.find(_ClassName);
    if (itr != g_ReflectRegisterMap.end())
	{
          
   
        return ((PF_CREATE_OBJECT)itr->second)();
	}
    return nullptr;
}

inline void InitClassReflect()
{
          
   
    //要反射的类必须添加
    ADD_CLASS_REGISTER(CA);
    ADD_CLASS_REGISTER(CB);

}

反射类例子

CReflectBase.h

#pragma once

class CReflectBase
{
          
   
public:
    virtual void ShowTest() = 0;
};

CA .h

#pragma once
#include "CReflectBase.h"

class CA :public CReflectBase
{
          
   
public:
    void ShowTest();
};

CA.cpp

#include "CA.h"
#include <iostream>

using namespace std;

void CA::ShowTest()
{
          
   
    cout << "CA::ShowTest()
";
}

CB .h

#pragma once
#include "CReflectBase.h"

class CB :public CReflectBase
{
          
   
public:
    void ShowTest();
};

CB.cpp

#include "CB.h"
#include <iostream>

using namespace std;

void CB::ShowTest()
{
          
   
    cout << "CB::ShowTest()
";
}

调用例子

main.cpp

#include "CReflectRegister.h"

int main()
{
          
   
    auto obj = ClassNameCreateObj("CA");
    if (nullptr != obj)
    {
          
   
        obj->ShowTest();
        delete obj;
    }

    obj = ClassNameCreateObj("CB");
    if (nullptr != obj)
    {
          
   
        obj->ShowTest();
        delete obj;
    }

本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;

2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;

3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;

4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;

5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/293009.html

(0)
上一篇 2022年11月12日 22:11
下一篇 2022年11月12日 22:11

相关推荐

发表回复

登录后才能评论