Unreal C++不允許指針指向不完整的類類型(踩坑)


不知道是Unreal Runtime變嚴格了還是還是框架有變,官方視頻4.09貌似就沒有報錯:不允許指向不完整的類型,可能是Unreal把導出的runtime給精簡了,我用4.24兩個Component都需要自己手動引用.h文件。
好在通過VS大概能確定需要引用哪個.h,不然我還要全網搜索太麻煩。

// SpawnVolumn.h
private:
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Spawning", 
            meta = (AllowPrivateAccess = "true"))
	class UBoxComponent* whereToSpawn;

// SpawnVolumn.cpp
FVector ASpawnVolumn::GetRandomPositionVolumn()
{
        // 編譯器報錯:whereToSpawn不允許指針指向不完整的類類型
	FVector SpawnOrigin = whereToSpawn->CalcBounds().Origin; 
	FVector SpawnExtend = whereToSpawn->GetScaledBoxExtent();

	return UKismetMathLibrary::RandomPointInBoundingBox(SpawnOrigin, SpawnExtend);
}

class UBoxComponent其實我是不知道這個UBoxComponent定義在哪里,官方視頻里也沒有去引用某個.h文件,好在VS足夠強大,右鍵‘轉到定義’,VS會索引到幾個UBoxComponent相關.h,一般引用文件在Engine下

需要手動寫明引用頭文件#include "Runtime/Engine/Classes/Components/BoxComponent.h"

后續一系列的“不允許指針指向不完整的類類型”報錯都可以用這種方式解決。

又遇到個pointer to incomplete class type is not allowed

感嘆下Unity選擇C#作為游戲開發語言非常明智,倒不是說運行速度有多快,代碼質量有多高,但新手友好不容易踩坑浪費一些時間在代碼編譯上,雖然說藍圖連線小白,但我一個程序敲代碼更順手不用記那些框框名稱,有IDE為我補全,再次吐槽下Unreal對IDE的智能補全支持不好。

C++各種認真寫代碼的格式我認,但是pointer to incomplete class type is not allowed報錯在我已經引用了頭文件后依然固執標紅,害我在VS這糾結好久,其實你去Unreal里編譯是通過的,煩人!

來看下我遇到的問題:

就是這個萬惡紅波浪線。

其實在Unreal里編譯出錯會具體告訴你:缺少頭文件定義,我需要在當前xxxGameMode.cpp中引用這個ACharacter class定義的頭文件,有兩種方式找到這個頭文件位置。

  1. Unreal官方文檔
  2. 在VS中用F12 Go to Definition找到這個類定義文件。

引用Character.h完后再編譯報錯提示USpawnMovementComponent未定義,因此還需要為myCharacter->GetMovementComponent()引入PawnMovementComponent.h

所以這一行代碼其實是需要引入兩個.h

#include "GameFramework/Character.h"
#include "GameFramework/PawnMovementComponent.h"

最后感嘆:Unity C#用起來真舒服。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM