Unreal Engine 4 C++ UCLASS构造函数易出错分析

Unreal Engine 4 C++ UCLASS构造函数易出错分析

好记性不如烂笔头啊,还是记录一下!


在Unreal Engine 4的任意类中通常会见到两个宏:

  • GENERATED_BODY()
  • GENERATED_UCLASS_BODY()

在一篇教程中有时候会有这样的说法:

11

这个说法并不严谨,并没有完全解释UCLASS_BODY()和BODY()区别。

具体分析:

首先为什么有两个宏定义的区别,主要是考虑到,继承父类之后,在于是否需要对父类的东西有所改动,构造函数的初始化亦是如此。

下面来说明下两种方法的不同:


1.GENERATED_BODY()

如果定义的是GENERATED_BODY(),那么意味着我不需要使用父类的构造函数,也就是说,我不能直接使用父类的声明,但是,我需要去实现的时候,我就必须自己去声明,否则就会报错。

  • MyCharacter.h
UCLASS()
class MYCHARACTER_API AMyCharacter : public ACharacter
{
    GENERATED_BODY()

public:
    AMyCharacter(const FObjectInitializer& ObjectInitializer);

};

然后就可以在CPP中实现自己声明的这个构造函数,编译通过。

  • MyCharacter.cpp
AMyCharacter::AMyCharacter(const FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitializer)
{

}

如果不去声明自己的构造函数,就会报错:

MyCharacter.cpp(7): error C2084: 函数“AMyCharacter::AMyCharacter(const FObjectInitializer &)”已有主体
MyCharacter.h(14): note: 参见“{ctor}”的前一个定义


1.GENERATED_UCLASS_BODY()

如果定义的是GENERATED_UCLASS_BODY(),那么意味着我使用父类的构造函数,也就是说,我不需要为自己声明构造函数,直接去实现父类声明那个构造函数。

  • MyCharacter.h
UCLASS()
class MYCHARACTER_API AMyCharacter : public ACharacter
{
    GENERATED_UCLASS_BODY()
};

那么在CPP文件中去实现,而不需要在H里面去声明,编译通过!

  • MyCharacter.cpp
AMyCharacter::AMyCharacter(const FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitializer)
{

}

如果还去声明自己的构造函数,就会报错:

UCLASS()
class MYCHARACTER_API AMyCharacter : public ACharacter
{
    GENERATED_UCLASS_BODY()

public:
    AMyCharacter(const FObjectInitializer& ObjectInitializer);

};

也就是这个最常见的错误。

error C2535: “AMyCharacter::AMyCharacter(const FObjectInitializer &)”: 已经定义或声明成员函数
note: 参见“AMyCharacter::AMyCharacter”的声明

完结..


本文参考:少狼 – 敬畏知识的顽皮狗 » UE4 C++ UCLASS构造函数易出错分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值