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#用起来真舒服。

posted @ 2020-04-20 16:16  bylle  阅读(7014)  评论(0编辑  收藏  举报