【C++里那些幺蛾子】问:类的声明中和定义中类型前面那些class是干啥的?答:前置声明( Forward Declarations)

上次写C++代码好像是很多年前的事了,要不是再次入了UE4的坑,这辈子也不太想写C++了。据说这些年C++又迭代了好几个版本,再加上UE4的魔改,真是一言难尽。配置好UE4新建了一个C++类,顿时有点蒙圈。。。

例子

下面两个文件(.h和.cpp)定义了一个类,但是代码里却出现了两次class关键字,其中一个是正常声明一个类(第9行);另一个则是放在了一个函数的参数声明中类型的前面(第20行)。这种用法似认识又不认识。

//TPPCharacter.h
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "TPPCharacter.generated.h"

UCLASS()
class SIDESCROLLER_API ATPPCharacter : public ACharacter
{
	GENERATED_BODY()
public:
	ATPPCharacter();

protected:
	virtual void BeginPlay() override;

public:	
	virtual void Tick(float DeltaTime) override;
	virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;

};
//TPPCharacter.cpp
#include "TPPCharacter.h"

ATPPCharacter::ATPPCharacter()
{
	PrimaryActorTick.bCanEverTick = true;
}
void ATPPCharacter::BeginPlay()
{
	Super::BeginPlay();
}
void ATPPCharacter::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
}
void ATPPCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);
}


前置声明( Forward Declarations)

复习了一下教科书,恍然大悟!这种用法早已有之,和C++新版本以及UE4没啥关系。它们叫做前置声明,其实就是告诉编译器:
“这个类型我先不包含它的头文件了,您先别着急,后面类的定义里调用它的时候我一定补上!”
这种做法有可能是防止头文件循环包含,也有可能是头文件树太庞大。

补充

我实验了一下,在本例中前置声明的class其实可以省略,应该是在#include "CoreMinimal.h"的头文件树中已经包含了定义UInputComponent*的头文件。UE4为了防患于未然,统统都加上了这种措施。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开发游戏的老王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值