根据字符串类名动态创建对象

VS Code+ESP-IDF开发避坑指南:头文件标红报错的5种解决方法(附CMakeLists.txt配置) 本文详细解析了在VS Code中使用ESP-IDF开发ESP32时头文件标红报错的5种解决方法,包括环境配置检查、CMakeLists.txt规范配置、路径解析策略、缓存清理技巧和高级调试手段。特别提供了CMakeLists.txt的实战配置示例,帮助开发者彻底解决头文件路径问题,提升开发效率。 阅读详情

根据字符串类名动态创建对象

老板很无理的要求,硬是让程序能够根据给定的字符串类名来创建相应的对象,哎,为此折腾了几天!

////////////////////////reflect.h文件



#ifndef REFLECT_H

#define REFLECT_H



class ClassDef;

class __ClassDefiner;



typedef void (*ConstructObjectFn)(void *pObject);

typedef void (*DestructObjectFn)(void *pObject);



//自己重载new运算符

inline void * __cdecl operator new(unsigned int size,void* ptr,int le,char ch) 

{ 

    return ptr;

};



#define DEFINE_HANDLE_TYPE(name) /

    typedef struct TT{int __nothing;} name##_t, *name;



//类的构造函数和析构函数

#define DO_DEFAULT_FUNCTIONS(_ClassName) /

    void Default##_ClassName##Constructor(void *ptr)/

{/

    new(ptr,(int)0,(char)0) _ClassName;/

};/

    void Default##_ClassName##Destructor(void *ptr)/

{/

    _ClassName *thePtr = (_ClassName*)ptr;/

    thePtr->~_ClassName();/

};/



#define DO_AUTO_CLASSLIST(name) /

    static __ClassDefiner __##name##_definer(&_##name##_Class__);



//

#define CLASS_SYMBOL(name, parentSymbol, construct_fn, destruct_fn) /

    ClassDef _##name##_Class__ = { /

#name, #parentSymbol, /

    construct_fn, destruct_fn, /

    sizeof(name) ,/

}; /

    DO_AUTO_CLASSLIST(name) /

    __int32 __impl_instance_##name##__;                  



 





class ClassDef 

{

public:



    char *m_ClassName;

    char *m_ParentClass;



    //构造函数和析构函数

    ConstructObjectFn m_ConstructFn;

    DestructObjectFn m_DestructFn;



    // How big an object of this class is (set automatically).

    long m_ClassObjectSize;

};



class __ClassDefiner

{

public:



    __ClassDefiner(ClassDef *pDef);





    ClassDef        *m_pClass;

    __ClassDefiner  *m_pNext;



};

#define Declare(CLASSC,CLASSP)  /

    DO_DEFAULT_FUNCTIONS(CLASSC)/

    CLASS_SYMBOL(CLASSC,CLASSP,Default##CLASSC##Constructor,Default##CLASSC##Destructor)



class classMgr 

{

public:

    void* GetClassByName(char* _name);



};



#endif



 

 

///////////////////////reflect.cpp文件

#include "reflect.h"

#include <iostream>



__ClassDefiner *__g_ClassDefinerHead = NULL;





__ClassDefiner::__ClassDefiner( ClassDef *pDef )

{

    m_pClass = pDef;

    m_pNext = __g_ClassDefinerHead;

    __g_ClassDefinerHead = this;

}



void* classMgr::GetClassByName( char* _name )

{

    __ClassDefiner* cd = __g_ClassDefinerHead;

    while (cd)

    {

        if ( strcmp(cd->m_pClass->m_ClassName ,_name) == 0  )

        {

            void *p = malloc(cd->m_pClass->m_ClassObjectSize);

            cd->m_pClass->m_ConstructFn(p); 

            return p;

        }

        cd = cd->m_pNext;

    }

    return NULL;

}
 
////////////////////////测试程序

//////////////Base、Derived和Child为自己写的测试类,其继承关系为Derived和Child都继承于Base



///////////////////////建立类似于MFC RTTI的类型识别网

Declare(Derived,Base);

Declare(Child,Base);





int main()

{

    classMgr cm;

    Base* b=(Base *)cm.GetClassByName("Derived");

    b->DoSth();

    getchar();

    free(b);

    b=(Base *)cm.GetClassByName("Child");

    b->DoSth();

    getchar();

    return 0;

}
 
Cocos Creator实战:5步搞定棋牌游戏大厅场景开发(附完整代码) 本文详细介绍了使用Cocos Creator 3.8开发棋牌游戏大厅的5个关键步骤,包括工程配置、动态UI系统实现、核心交互功能开发、性能优化及调试发布技巧。通过模块化代码和实战案例,帮助开发者快速构建高交互性的棋牌游戏大厅,提升用户留存率。 阅读详情

相关推荐

TwinCAT 3 实战:手把手教你用PLC和C++读写第三方伺服驱动器的CoE参数

本文详细介绍了在TwinCAT 3环境中通过PLC和C++两种技术路线实现对第三方伺服驱动器CoE参数的精准操控。从环境准备到具体实现,包括硬件配置、核心函数使用及性能优化策略,为工程师提供了全面的实战指南。特别针对CoE参数访问的效率和稳定性问题,给出了实用的调试技巧和异常处理方案。

weixin_33743248的博客 445

如何根据字符串动态创建类对象

如何根据字符串动态创建类对象       今天跟同事聊天的时候,同事有一个需求,就是如何根据类的名字和值,动态返回该类的实例对象。比如,我们给一个函数传入字符串类名”java.lang.String”和值“wuguowei”,则该函数则返回一个值为“wuguowei”的字符串对象

0溺水的鱼O的专栏 1万+

详解各类以太网标准10BASE-T/100BASE-T4/100BASE-FX/1000BASE-X等

以太网是现实世界中最普遍的一种计算机网络。以太网有两类:第一类是经典以太网,第二类是交换式以太网,使用了一种称为交换机的设备连接不同的计算机。经典以太网是以太网的原始形式,运行速度从3-10 Mbps不等;而交换式以太网正是广泛应用的以太网,可运行在100Mbps、1000Mbps和10000Mbps高速率,分别以快速以太网、千兆以太网和万兆以太网的形式呈现

不积跬步,无以至千里! 5万+

根据字符串动态创建类对象

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34343308的博客 538

STC8H开发(十六): GPIO模拟SPI驱动Ci24R1实现低成本无线遥控

本文详细介绍了如何使用STC8H单片机通过GPIO模拟SPI驱动Ci24R1无线模块,实现低成本无线遥控方案。内容涵盖硬件设计要点、软件驱动开发技巧及实战优化经验,特别适合消费电子产品开发者参考。Ci24R1凭借其高性价比和双模协议支持,成为替代传统nRF24L01+的理想选择。

weixin_30378623的博客 351

基于Simulink的魔术公式轮胎动力学仿真

本篇博文主要用来记录汽车系统动力学课程的学习,仅供课程阶段参考,与实际工程应用还有较大距离。基于Simulink的魔术公式轮胎动力学仿真本实例主要有以下任务。1.建立魔术公式轮胎动力学仿真模型。2.绘制不同载荷下的轮胎纵向力—滑动率关系曲线。3.绘制不同载荷下的轮胎侧向力—侧偏角关系曲线。4.绘制不同载荷下的轮胎回正力矩—侧偏角关系曲线。提示:以下是本篇文章正文内容,下面案例可供参考。

shy_201992的博客 6940

在delphi中如何动态建立类的实例

本文为原创,如需转载,请注明作者和出处,谢谢!    在面向对象语言中,用两种方法建立类的实例:静态建立和动态建立。静态建立就是在程序中显式地建立类的实例,如c1 =TClass1.Create()。而动态建立是在只知道类名的前题下建立类的实例。动态建立在实现上要比静态建立更灵活,因为动态建立无需引用被建立类,并且更容易实现如多态等面向对象特性。一、    动态

一个被知识诅咒的人 1528

基于浏览器插件的拼多多买家订单导出方法

基于浏览器插件的拼多多买家订单导出方法

2501_93542170的博客 1725

完成DELPHI的不可能功能:宏替换!(如何根据字符串来创建对象)

完成DELPHI的不可能功能:宏替换!(如何根据字符串来创建对象)  我们在做一个比较大的系统(采用MDI方式)的时候,希望项目中的菜单、窗体全部是动态创建的,这样的话,程序员就很容易利用数据库将这些内容储存起来,需要的时候再根据这个用户的权限来取得相应的记录,根据这些记录来创建菜单、表单等!  在这个过程中,我们必须面对的一个问题是: 在储存窗体对象的时候我们只能储存它的对象名(字符串)

ToB公司的战略与经营 2742

jlink驱动安装

jlink驱动下载安装及keil识别

qq_43868701的博客 3万+

【AI就业干货12】机器学习八股文速通:从损失函数到 XGBoost,一篇带走全部面试点

本文总结了机器学习面试的核心知识点,涵盖监督与非监督学习、线性模型、正则化、决策树、KNN/K-means、SVM、集成学习、梯度下降、评估指标、特征工程、降维、概率模型等内容。重点包括:损失函数选择(MSE/交叉熵)、正则化作用(L1稀疏/L2平滑)、决策树划分准则、集成学习方法(Bagging降方差/Boosting降偏差)、XGBoost优化等。提供了30秒速记口诀和XGBoost代码示例,帮助快速掌握面试要点。全文采用公式+代码+口诀的形式,系统梳理了机器学习从理论到实践的常见考点。

m0_51738372的博客 731

《深入浅出MFC》系列之动态创建

/**********************************************************************************************************************   发布日期:2017-11-1316:23:44*   进度:*   作者:LuoTian*   备注:动态创建**********************...

weixin_34040079的博客 92

自动驾驶---Planning模块详细介绍(以Apollo为例)

主要介绍高速场景下Planning模块,至于低速的泊车场景对比高速场景或者城区场景有比较大的差距(后面也会介绍泊车场景),本篇Planning介绍主要包括三大子模块Routing,Behavioural Planning以及Motion Planining,并且对比较重要的Decider和Optimizer都做了通俗化的说明供大家思考,以便于后续理解更深入的内容,后面有时间会再开一些篇幅对这些模块进行更加深入的讲解。

智能汽车人的博客 2088

字符串反射创建对象,不需要预设对象类

字段类型与 JSON value 类型不一致 | 引入 fastjson 的 TypeUtils.cast(value, fieldType, ParserConfig.getGlobalInstance()) 做一层转换 || `clazz.newInstance()` 已过时 | 换成 `clazz.getDeclaredConstructor().newInstance()` |- 如果字段是另一个 POJO,但 JSON 里给的是嵌套 JSONObject,也会直接塞失败。

靡不有初,鲜克有终 816

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

MFC中运行时类型识别和动态创建类对象

DECLARE_DYNAMIC IMPLEMENT_DYNAMIC RUNTIME_CLASS DECLARE_DYNCREATE CRuntimeClass 等相关的宏定义。都是为动态创建类对象。为什么要动态创建类对象呢?在建立一个MFC程序时,MFC要搭起一个框架,这时它需要用到用户定义的类型的信息,比如定义一个CMyMFC程序,它需要使用CMyMFCApp这个类构造对象。但微软在制

学而不思则罔 1399

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java使用反射实现根据字符串类名及参数创建对象

要根据字符串创建对象,可以使用 Class.forName(String) 方法; 而要新建一个可以指定初始值参数的对象,就必须得使用 getConstructor(Class<T>...) 方法; 之后再对Constructor对象调用 newInstance(Object...) 方法。 然而,getConstructor 方法要接受零个或多个Class对象,且 n...

weixin_38167363的博客 4790

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C#根据字符串类名创建类对象

/带参数方法,ObjParms 参数 传递参数组对象 method.Invoke(ObjParam, ObjParms);//创建名称指定类型的对象实例(Person 实例)//实例(Person)的 属性(Name)对象。//StrAssemblyName 程序集名称。//实例(Person)带返回值方法对象创建。///实例(Person)方法的参数对象数组。//获取实例(Person)的对象。//获取实例(Person)的类型。//重构实例(Person)方法;//全称组成:表空间.类名称。

bluefox1979的专栏 595

java 反射 通过类名_Java使用反射实现根据字符串类名及参数创建对象

要根据字符串创建对象,可以使用 Class.forName(String) 方法;而要新建一个可以指定初始值参数的对象,就必须得使用 getConstructor(Class...) 方法;之后再对Constructor对象调用 newInstance(Object...) 方法。然而,getConstructor 方法要接受零个或多个Class对象,且 newInstance 方法也要接受零个或...

weixin_29483853的博客 1477

Java中的字符串类

字符串类Sring

二哈喇子! 1270

C#如何根据字符串动态的创建对象(类)

网上查询的资料,整理备用 参考连接 http://blog.youkuaiyun.com/wlanye/article/details/7045625 //反射动态创建对象: //如果A,B,C,D都与执行代码同一个程序集.则可以这样调用 //System.Reflection.Assembly.GetExecutingAssembly().CreateInstance("命名空间.类名", false); // 如: //object o = System.Reflection.Assembly.GetExec

gopojim的专栏 7738

《新手也能懂的 Unity 反射:动态创建对象、访问属性的具体代码示例》

反射是 C# 提供的特性,让你在运行时获取类型信息(如类名、属性、方法),并基于这些信息动态执行操作。动态创建对象:从字符串类名实例化对象。访问属性:在不直接引用对象的情况下,读取或修改其属性值。反射的核心类是和命名空间下的工具(如Activator反射是 Unity 开发中的高级技巧,通过动态创建对象和访问属性,你可以实现更灵活的代码结构。动态创建对象:使用和。访问属性:使用和SetValue()。通过这些示例,你可以轻松扩展功能,比如动态调用方法或处理事件。

2501_93895250的博客 529

动态创建用户对象对象的方法

分类: 分析代码: string ls_objectname IF NOT IsValid(inv_NewStyle) or isNull(inv_NewStyle) THEN  if ai_style= FlatStyle then    ls_objectname = "n_cst_buttonsrv_NewStyle_flat"  elseif ai_style= XPSt

城市蜗牛 707

Java工具类之字符串类(超详细)

上例测试中main()方法中实例化了3个点,分别使用equals方法与==进行比较,因为Point类覆盖了父类的equals()方法,该方法判断如果两个Point对象的x坐标和y坐标相等,则返回true,所以第1行输出为true,"=="运算符比较引用数据类型时,判断两个引用是否指向同一个对象,p1,p2,p3都分别是不同的对象,所以第2行和第4行输出为false。而使用动态方式创建的字符串,不管前后两次创建的字符串内容是否相同,每创建一次,都会在堆内存中会产生出不同的对象,即两个引用指向不同的地址。

My_story_begins的博客 2174

Java面向对象系列[v1.0.0][使用反射生成并处理对象]

Class对象可以获得该类的方法(由Method对象表示)、构造器(有Constructor对象表示)、成员变量(由Field对象表示),这三个类都位于java.lang.reflect包下,并实现了java.lang.reflect.Member接口,程序可以通过Method对象来执行对应的方法,通过Constructor对象来调用对应的构造器创建实例,通过Field对象直接访问并修改对象的成员变量值

一块大洋 5464
上一篇: C++ 虚函数表解析
下一篇: 手机游戏该如何设计盈利模式?
dadalan
博客等级 码龄20年 428粉丝 770原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值