首页 > 其他分享 >宏 GENERATED_UCLASS_BODY() 与 GENERATED_BODY() 简析

宏 GENERATED_UCLASS_BODY() 与 GENERATED_BODY() 简析

时间:2023-05-26 15:56:18浏览次数:40  
标签:BODY 简析 GENERATED API ASUsableActor public 构造函数


继承自UE4引擎的类会生成一些宏代码。 这此宏代码的作用就是帮助生成构造函数和相关成员函数


  1. UCLASS()
  2. class SECTION1_API ASUsableActor : public AActor
  3. {
  4. GENERATED_BODY()
  5. public:
  6. };



  1. UCLASS()
  2. class SURVIVALGAME_API ASUsableActor : public AActor
  3. {
  4. GENERATED_UCLASS_BODY()
  5. public:
  6. };


F12跳转到这两个宏的声明文件中

  1. #define GENERATED_BODY() \
  2. PRAGMA_DISABLE_DEPRECATION_WARNINGS \
  3. public: \
  4. ASUsableActor_RPC_WRAPPERS_NO_PURE_DECLS \
  5. ASUsableActor_CALLBACK_WRAPPERS \
  6. ASUsableActor_INCLASS_NO_PURE_DECLS \
  7. ASUsableActor_ENHANCED_CONSTRUCTORS \
  8. private: \
  9. PRAGMA_POP


GENERATED_BODY() 会经过一系列的宏替换  最下边成员访问方式为 private:  也就是说紧随 GENERATED_BODY()之后而又没有显著更改成员访问方式,那么访问方式则为private 


  1. #define GENERATED_UCLASS_BODY() \
  2. PRAGMA_DISABLE_DEPRECATION_WARNINGS \
  3. public: \
  4. ASUsableActor_RPC_WRAPPERS \
  5. ASUsableActor_CALLBACK_WRAPPERS \
  6. ASUsableActor_INCLASS \
  7. ASUsableActor_STANDARD_CONSTRUCTORS \
  8. public: \
  9. PRAGMA_POP

而GENERATED_UCLASS_BODY()  后边声名的成员变量访问方式则为公有。


  1. #define ASUsableActor_RPC_WRAPPERS
  2. #define ASUsableActor_CALLBACK_WRAPPERS

这两个为空宏, 在C/C++ 中空宏会被空格替换    大多用来表示注释


GENERATED_UCLASS_BODY() 中的两个非空宏声明如下

  1. #define ASUsableActor_INCLASS \
  2. private: \
  3. static void StaticRegisterNativesASUsableActor(); \
  4. friend SECTION1_API class UClass* Z_Construct_UClass_ASUsableActor(); \
  5. public: \
  6. DECLARE_CLASS(ASUsableActor, AActor, COMPILED_IN_FLAGS(0), 0, Section1, NO_API) \
  7. DECLARE_SERIALIZER(ASUsableActor) \
  8. /** Indicates whether the class is compiled into the engine */ enum {IsIntrinsic=COMPILED_IN_INTRINSIC}; \
  9. UObject* _getUObject() const { return const_cast<ASUsableActor*>(this); }

这几行主要是为类声明一些成员方法

  1. #define ASUsableActor_STANDARD_CONSTRUCTORS \
  2. /** Standard constructor, called after all reflected properties have been initialized */ \
  3. NO_API ASUsableActor(const FObjectInitializer& ObjectInitializer); \
  4. DEFINE_DEFAULT_OBJECT_INITIALIZER_CONSTRUCTOR_CALL(ASUsableActor) \
  5. private: \
  6. /** Private copy-constructor, should never be used */ \
  7. NO_API ASUsableActor(const ASUsableActor& InCopy); \
  8. public:

这里可以看到 声明了一个公有构造函数  和一个私有的拷贝构造函数, 公有构造函数参数为FObjectInitializer的引用常量。 而拷贝构造函数声明为私有,则表示拷贝构造函数不可用



下边两个是 GENERATED_BODY()  中引用的非空宏声明

  1. #define ASUsableActor_RPC_WRAPPERS_NO_PURE_DECLS \
  2. static inline void StaticChecks_Implementation_Validate() \
  3. { \
  4. }

  1. #define ASUsableActor_INCLASS_NO_PURE_DECLS \
  2. private: \
  3. static void StaticRegisterNativesASUsableActor(); \
  4. friend SECTION1_API class UClass* Z_Construct_UClass_ASUsableActor(); \
  5. public: \
  6. DECLARE_CLASS(ASUsableActor, AActor, COMPILED_IN_FLAGS(0), 0, Section1, NO_API) \
  7. DECLARE_SERIALIZER(ASUsableActor) \
  8. /** Indicates whether the class is compiled into the engine */ enum {IsIntrinsic=COMPILED_IN_INTRINSIC}; \
  9. UObject* _getUObject() const { return const_cast<ASUsableActor*>(this); }


  1. #define ASUsableActor_ENHANCED_CONSTRUCTORS \
  2. private: \
  3. /** Private copy-constructor, should never be used */ \
  4. NO_API ASUsableActor(const ASUsableActor& InCopy); \
  5. public: \
  6. DEFINE_DEFAULT_CONSTRUCTOR_CALL(ASUsableActor)

DEFINE_DEFAULT_CONSTRUCTOR_CALL 在VS中并没有跟踪到在何处如何声明, 根据字面解释应该是定义默认的构造函数,也就是最基本的构造函数。

同样拷贝构造函数不可用


通过以上分析可以认为 GENERATED_BODY()为我们生成默认构造函数,  而GENERATED_UCLASS_BODY() 为我们生成带有指定参数类型的构造函数

标签:BODY,简析,GENERATED,API,ASUsableActor,public,构造函数
From: https://www.cnblogs.com/tomato-haha/p/17434952.html

相关文章

  • 【一步步开发AI运动小程序】八、利用body-calc进行姿态识别
    随着人工智能技术的不断发展,阿里体育等IT大厂,推出的“乐动力”、“天天跳绳”AI运动APP,让云上运动会、线上运动会、健身打卡、AI体育指导等概念空前火热。那么,能否将这些在APP成功应用的场景搬上小程序,分享这些概念的红利呢?本系列文章就带您一步一步从零开始开发一个AI运动小程序......
  • postman上传文件显示403,body显示网页代码
     可见图片文件上传不了。 往右侧看,可得图片占用资源过多。发现有4mb。将图片压缩后成1mb后可行。   一般post上传最大为2MB,当然它可以修改。......
  • Spring Web Body 转化常见错误
    案例1:Noconverterfoundforreturnvalueoftype在直接用SpringMVC而非SpringBoot来编写Web程序时,我们基本都会遇到“Noconverterfoundforreturnvalueoftype”这种错误。实际上,我们编写的代码都非常简单,例如下面这段代码:(https://www.java567.com,搜"spring"......
  • JPA通用策略生成器(@GeneratedValue 四种标准用法为TABLE, SEQUENCE, IDENTITY, AUTO)
    JPA通用策略生成器查看JPA的源码可知:packagejavax.persistence;/***Definesthetypesofprimarykeygenerationstrategies.**@seeGeneratedValue**@sinceJavaPersistence1.0*/publicenumGenerationType{/***Indicatesthatthepers......
  • Ext中的get、getDom、getCmp、getBody、getDoc的区别
    Ext中包含了几个以get开头的方法,这些方法可以用来得到文档中DOM、得到当前文档中的组件、得到Ext元素等,在使用中要注意区别使用。1、get方法get方法用来得到一个Ext元素,也就是类型为Ext.Element的对象,Ext.Element类是Ext对DOM的封装,代表DOM的元素,可以为......
  • koa-body 中间件解析原理
    常见的请求数据类型:application/json 常见于post请求未经过任何处理以json的格式通过body传输application/x-www-form-urlencoded 提交的表单数据会转换为键值对并按照key1=val&key2=val2的方式进行编码,常见于POST提交表单以及原生的处理方式。multipart/form-data......
  • cuda nbody实验
    1并行化非常简单得,直接分配4096线程处理,每个线程处理一个天体。每个kernel函数中的循环,就去全局变量里面找其他点的信息,进行计算就好了2优化2.1共享内存按1中的,是每个线程处理n个,这里的话,每个线程分批次处理,每次处理一部分。引入共享内存。......
  • 使用 @ResponseBody 注解直接返回json字符串结果中文出现乱码
    在类上直接使用@RestController,这样子,里面所有的方法都只会返回json字符串了,不用再每一个都添加@ResponseBody!我们在前后端分离开发中,一般都使用@RestController,十分便捷!@RestControllerpublicclassUserController{//produces:指定响应体返回类型和编码@Request......
  • 旅行商问题简析
    旅行商问题是一个很经典的图论问题。不重复的旅行商问题用数学语言叙述如上所示,式中xij表示节点i到节点j,cij则表示节点i到节点j的路径长度;第一个约束保证一个节点只出发一次,第二个约束保证一个节点值到达一次。解决非对称旅行商问题的常用方法是指派算法。指派算法的实质是匈牙......
  • unity利用Rigibody实现第一人称移动
    1.CameraRotation脚本,将它给MainCamera,实现上下视角旋转usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassCameraRotation:MonoBehaviour{[Tooltip("鼠标灵敏度")]publicfloatRotateSpeed=5f;//x轴的旋转......