本篇文章使用引擎版本:4.11
在刚开始写C++专案的时候肯定是被这二个macro搞的有点混乱,稍微有经验一点的程式设计师马上就会知道这二个macro肯定是用来产生某些预设方法用的。其产生的档案会放在YouProject\Intermediate\Build\Win64\UE4\Inc\YouProject\xxx.generated.h里面。
然而在使用的过程当然,总是会看到一些范例程式一下子用GENERATED_BODY(),又一下子用GENERATED_UCLASS_BODY(),实在搞得我好混乱阿,到底要用那个才对?先说结论,GENERATED_UCLASS_BODY()其实是4.6版本之前留下来的macro,在4.6的时候其release note有以下说明:
- 现在定义和使用你的类“正常” C ++的构造函数。您可以使用参数构造函数现在也!
- 你不再需要提供一个类别为你的属性将它们暴露给编辑或蓝图。现在你会得到一个默认类别。
- FPostContructInitializeProperties已被弃用。它是由取代FObjectInitializer,你只有当你真正需要它来指定。
- “GENERATED_BODY”不再重置您的保护级别设置为“公开”。它会保存你的设置。
- 请使用新的“GENERATED_BODY”符,而不是“GENERATED_UCLASS_BODY”。它使许多这些新的改进!
也就是说,4.6以上的版本都用GENERATED_BODY就行了,其主要的差异点在于你不需要再在cpp强逼去实作下面这个function。
UMyClass :: UMyClass(常量FObjectInitializer&ObjectInitializer)
:超(ObjectInitializer){
}
取而代之的是,若你需要constructor,你只需要在.h宣告:
UMyClass();
之后在cpp实作就行了:
UMyClass :: UMyClass(){}
省掉那恼人对user而言完全不需要知道在干嘛的FObjectInitializer,取而代之的是是更直觉的C++宣告,实在是干净许多。
另外补充一个不知道算不算bug的东西。
由于我需要在物件的destructor中做一些东西,根据Rule of Five的指导,我必须同时宣告下面这五个function才行
虚拟〜UMyClass(){
//我实现
};
UMyClass(常量UMyClass&)=默认值;
UMyClass运算符=(常量UMyClass&)=默认值;
UMyClass(UMyClass &&)=默认值;
UMyClass运算符=(UMyClass &&)=默认值;
在宣告之后编辑发现编辑器说已经有宣告body了,本来有点感心说果然是UE4,居然连这个点都有handle到了。然而在追了一下原码之后发现,却引擎只有自动产生copy-constructor跟copy-assignment而已,move相关的都没有实作到。
其中copy-constructor位置在MyClass.generated.h中的ENHANCED_CONSTRUCTORS下面:
私人:\
/ **私人拷贝构造函数,不应该被用来* / \
NO_API UMyClass(常量UMyClass和InCopy中); \
而Copy assignment则是在引擎中的ObjectBase.h下面的DECLARE_CLASS这个macro中宣告:
的#define DECLARE_CLASS(类,TSuperClass,TStaticFlags,TStaticCastFlags,TPackage,TRequiredAPI)\
私人:\
类运算符=(const的类&); \ ...
因此最后就只能自己再做个macro去补上对应的程式码了。
虽然没有严格遵守这个规则好像也不会怎么样……