創作內容

0 GP

[UE4]GENERATED_BODY() vs GENERATED_UCLASS_BODY()

作者:dorgon│2017-05-25 12:17:27│巴幣:0│人氣:842
部落格版本
======================================
本篇文章使用引擎版本: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有以下說明:

  • You now define and use “normal" C++ constructors for your classes. You can use parameterless constructors too now!
  • You no longer need to supply a category for your properties to expose them to the editor or Blueprints. You’ll get a default category now.
  • FPostContructInitializeProperties is deprecated. It’s replaced by FObjectInitializer, and you only have to specify it when you actually need it.
  • “GENERATED_BODY" no longer resets your protection level to “public". It will preserve your settings.
  • Please use the new “GENERATED_BODY" specifier instead of “GENERATED_UCLASS_BODY". It enables many of these new improvements!
也就是說,4.6以上的版本都用GENERATED_BODY就行了,其主要的差異點在於你不需要再在cpp強逼去實作下面這個function。
UMyClass::UMyClass(const FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitializer){
}
取而代之的是,若你需要constructor,你只需要在.h宣告:
UMyClass();
之後在cpp實作就行了:
UMyClass::UMyClass(){ }
省掉那惱人對user而言完全不需要知道在幹嘛的FObjectInitializer,取而代之的是是更直覺的C++宣告,實在是乾淨許多。
另外補充一個不知道算不算bug的東西。
由於我需要在物件的destructor中做一些東西,根據Rule of Five 的指導,我必須同時宣告下面這五個function才行
virtual ~UMyClass() {  
//my implement
};
UMyClass(const UMyClass&) = default;
UMyClass& operator=(const UMyClass&) = default;
UMyClass(UMyClass&&) = default;
UMyClass& operator=(UMyClass&&) = default;
在宣告之後編輯發現編輯器說已經有宣告body了,本來有點感心說果然是UE4,居然連這個點都有handle到了。然而在追了一下原碼之後發現,卻引擎只有自動產生copy-constructor跟copy-assignment而已,move相關的都沒有實作到。
其中copy-constructor位置在MyClass.generated.h中的ENHANCED_CONSTRUCTORS下面:
private: \
    /** Private copy-constructor, should never be used */ \
    NO_API UMyClass(const UMyClass& InCopy); \
而Copy assignment則是在引擎中的ObjectBase.h下面的DECLARE_CLASS這個macro中宣告:
#define DECLARE_CLASS( TClass, TSuperClass, TStaticFlags, TStaticCastFlags, TPackage, TRequiredAPI  ) \
private: \
    TClass & operator=(TClass const &);   \  …
因此最後就只能自己再做個macro去補上對應的程式碼了。
雖然沒有嚴格遵守這個規則好像也不會怎麼樣……
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=3587824
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:Unreal Engine 4

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

喜歡★dorgonman 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:[UE4] BitMas... 後一篇:[UE4]如何使用C++...

追蹤私訊切換新版閱覽

作品資料夾

aaa1357932大家
各位有空可以來我家看看畫作或聽聽我的全創作專輯!看更多我要大聲說昨天23:43


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】