九、蓝图与C++:Struct结构体
抛出问题
1.什么是结构体?
2.在什么情况下会用的结构体
一.以管理个人信息为例抛出结构体
假设我们要做一个管理个人信息数据的功能,比如要存储很多人的姓名,年龄,性别 信息.在没有结构体的情况下,我们可能会这么做?
1.创建3个数组分别存放姓名、年龄性别



2.输出个人信息

3.增加一个人的信息

4.删除一个人的信息

5.解析
从上面的操作可以看到,假如我们要存储的属性比较多,如身高,体重,生日,班级,各科成绩...
那岂不是每一条信息都要创建一个数组?假如有100条数据,就要创建100个数组来存储数据.
其次增/删操作,每次都会对所有数组进行操作,因为所有数组的数据都是依靠数组索引一一对应的,如果不对应,那么数据就混乱了,可能取数据的时候,张三的姓名,李四的年龄,王五的性别.
由此可得目前存在如下缺陷:
(1)数据扩展不方便,每储存一个属性就要创建一个专门的数组
(2)数据对应关系需要手动维护,容易出现对应关系错误问题
(3)数据增删操作繁琐,每次添加/删除数据都要对所有数组进行操作.
带着这几个问题,我们学习下struct
二.蓝图中的Struct结构体
1.创建结构体
创建一个个人信息的结构体


至此为止,我们已经可以回答本文开头的两个个问题:
struct是什么:
struct是一系列变量/属性的集合
什么时候会用到struct:
当一条数据包含多个属性/变量的时候
struct是一些列变量的集合这个特性也解决了数据扩展不便的问题和数据对应关系的问题
(1)数据扩展不方便,每储存一个属性就要创建一个专门的数组
(2)数据对应关系需要手动维护,容易出现对应关系错误问题
(3)数据增删操作繁琐,每次添加/删除数据都要对所有数组进行操作.
想要存储一个新的属性,只需要在结构体中添加一个变量即可
并且一个结构体就是一条数据,数据集中在一个地方,不存在数据分散存储导致的对应关系混乱问题
2.使用结构体实现上面的个人信息管理系统的增加减少信息
①输出个人信息

②增加一个人信息

③删除一个人信息

3)数据增删操作繁琐,每次添加/删除数据都要对所有数组进行操作.
3.蓝图中结构体的方法
①make+结构体名字:对结构体填充数据

②控制结构体变量属性是否显示

③控制结构体变量属性是否显示

三.C++中的Struct结构体
1.定义结构体格式
①C++中的struct可以使用USTRUCT()宏,与UCLASS()类似,可以控制struct能否在蓝图中使用(BlueprintType使struct可以在蓝图中使用).
添加了USTRCUT()宏,需要在struct中加入GENERATED_BODY()才能正常使用.
②如果明确该结构体只在C++中使用,可以不加USTRUCT()宏 ,同样也不需要加GENERATED_BODY()宏语法如下
③UE中的struct要以F开头
2.C++中的结构体代码
以Cpp_Actor这个C++类编写代码
.h文件
①C++中的结构体与蓝图结构体用法一致

②C++中的结构体变量进行赋值
.cpp文件
备注:分析一个我的错误理解
C++中对结构体的变量进行赋值后,在蓝图以这个C++声明的结构体创建一个变量,这个变量的初始值应该就是在c++中赋值的值 这个方法是错误的!!!
解释:
在蓝图中创建一个结构体的变量与在C++中 PersonInfo PersonA(创建结构体对象)其实是一个道理,在没有赋值的情况下这个蓝图结构体变量与C++中的结构体对象都是空的,所以要赋值操作
3.C++中的结构体数组使用
.h文件
.cpp文件

四.利用结构体结合UMG做个人管理系统

①创建个人信息结构体

②个人信息的UI(删除)


③个人信息列表UI(添加)





