void AFlyingPawn::SetupPlayerInputComponent(class UInputComponent* InputComponent)
{
//stuff...
}
注意参数类型前的"class"关键字,它是什么意思?
void AFlyingPawn::SetupPlayerInputComponent(class UInputComponent* InputComponent)
{
//stuff...
}
第一种可能性,如果UInputComponent
没有被声明,那么这可能是前置声明。因此
void AFlyingPawn::SetupPlayerInputComponent(class UInputComponent* InputComponent)
forward声明了一个名为UInputComponent
的类,而参数InputComponent
的类型是UInputComponent*
。
Note that a new class name may also be introduced by an elaborated type specifier which appears as part of another declaration, but only if name lookup can't find a previously declared class with the same name.
class U; namespace ns{ class Y f(class T p); // declares function ns::f and declares ns::T and ns::Y class U f(); // U refers to ::U Y* p; T* q; // can use pointers and references to T and Y }
第二个可能性是,关键字class
可能用于消除歧义。
如果在作用域中存在与类类型名称相同的函数或变量,则可以在名称前加上class以消除歧义,从而得到一个详细类型说明符。
例如:
int UInputComponent;
class UInputComponent { /* ... */ };
// without the class keyword it won't compile because the name UInputComponent is ambiguous
void AFlyingPawn::SetupPlayerInputComponent(class UInputComponent* InputComponent)
第三种可能性,它可能没有任何意义。
如果UInputComponent
已被声明为类,则使用关键字class
或不使用都不会改变任何内容。请注意,如果先前声明的类型不匹配,则编译将失败。
可能你已经知道,Unreal 通过管理同一基础类的多个实现来定义公共基础。每个开发人员必须使用引擎提供的类创建子类,以便在引擎中执行任务。
在这种情况下,我们需要一个 InputComponent,用于处理用户输入,解释并传递给Controllers和/或 Pawns。
例如,如果您要定义像 Pawns、PlayerControllers, AIControllers, HUD 等元素,则可以在 GameMode 中进行配置,然后将其配置到项目设置或直接通过 World Settings 配置到关卡中(如果您的关卡需要特定的GameMode)。这些引用也是类,将由引擎在适当的时间内实例化以设置游戏。
有了这个想法,这里就有缺点了。在UE4 C++中,因为引擎连结了松散的端点,有时您无法使用某些类,因为它们没有声明。当然,您可以包括它们,但是请考虑:如果您为一个类需要包括所有必要的内容,只是发现另一个类可能间接地要求该类,那么将会产生多少循环依赖关系?
解决方案是前向声明。在这种情况下,有一种特殊的风格称为速记前向声明,其中您可以在 使用该类的确切位置声明类型。
如果您只使用它一次,那么这非常方便,以免在文件开头出现可怕的声明列表。
例如,如果您想知道当前默认 Pawn 类的定义,可以在您的 GameMode 中检查 GetDefaultPawnClass
公共变量(我们称之为 MyGameMode
)。变量定义如下:
TSubclassOf < APawn > DefaultPawnClass
看到那个TSubclassOf
了吗?它实际上是一个类模板,用于确保类型安全。这是一个提示给编辑器,只显示从APawn
派生的类。
如果您使用自定义类型,并且基于我迄今讨论的内容,您可以找到如下内容:
TSubclassOf<class ASpeedyPawn> MySpeedyPawn;
struct foo
的结构体,你需要这样使用它:struct foo f;
。而在C++中,这并不是必须的,但为了向后兼容性,C++仍然保留了这种用法,并将其扩展到了class
关键字上。 - DeiDei