【C++里那些幺蛾子】问:类的声明中和定义中类型前面那些class是干啥的?答:前置声明( Forward Declarations)
2020-06-02 04:16
866 查看
上次写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为了防患于未然,统统都加上了这种措施。
相关文章推荐
- 【C/C++开发】C++之enum枚举量声明、定义、使用与枚举类详解与枚举类前置类型声明
- 关于C/C++中 Class, Struct, enum的定义声明位置
- c++ 父类成员函数的参数中有子类类型的对象 (前置声明解决)
- C++ 解析什么叫“class”类型重定义还有解决方法
- [转]C++ error C2011: “XXX”:“class”类型重定义
- “不完全类型”指在C++中有声明但又没有定义的类型。
- “不完全类型”指在C++中有声明但又没有定义的类型
- C++中可以用struct和class来定义类型,这两种类型有什么区别
- 在C中用struct实现C++中class的函数声明和定义
- c++ 前置声明不能随便用 会引起类型不完全的错误
- 在C中用struct实现C++中class的函数声明和定义
- C++中类型注册有的时候,函数找不到定义,可能是相应的头文件中防止重定义的声明,还是用原来的,没有做相应的更新
- c++ 前置声明不能随便用 会引起类型不完全的错误
- C++ typedef 类型前置声明
- “不完全类型”指在C++中有声明但又没有定义的类型
- c++ Premier 学习笔记(unit2 变量和基本类型 -声明与定义
- C++:类和对象,类:继承和组合,类的封装:private/public,类定义:class,类的声明和实现
- “class”类型重定义,include(头文件)重复加载 QT /c++
- “class”类型重定义,include(头文件)重复加载 QT /c++
- 【C++学习与应用总结】2: 关于类型前置声明