• 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);  };
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    • MyCharacter.cpp
    AMyCharacter::AMyCharacter(const FObjectInitializer& ObjectInitializer)     : Super(ObjectInitializer) {  }
    • 1
    • 2
    • 3
    • 4
    • 5

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

    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() };
    • 1
    • 2
    • 3
    • 4
    • 5

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

    • MyCharacter.cpp
    AMyCharacter::AMyCharacter(const FObjectInitializer& ObjectInitializer)     : Super(ObjectInitializer) {  }
    • 1
    • 2
    • 3
    • 4
    • 5

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

    UCLASS() class MYCHARACTER_API AMyCharacter : public ACharacter {     GENERATED_UCLASS_BODY()  public:     AMyCharacter(const FObjectInitializer& ObjectInitializer);  };
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

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

    完结..转自 http://blog.csdn.net/qq_20309931/article/details/52964391

  • 相关阅读:
    WebService又一个不爽的地方
    [biztalk笔记]1.Hello World!
    Flex4中使用HDividedBox,VDividedBox
    Flex:地图缩放平移效果(简易版)
    asp.net webform中submit按钮使用不当很容易犯的一个错误
    Silverlight Telerik控件学习:带CheckBox复选框的树形TreeView控件
    oracle odp.net 32位/64位版本的问题
    asmx迷10分钟升级成wcf熟手指南
    如何克制求知欲或好奇心
    随手小记:快速适应未必是个好策略
  • 原文地址:https://www.cnblogs.com/huojiaoqingchun0123/p/7742345.html
Copyright © 2020-2023  润新知