zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    yocto/bitbake 学习资源
    QEMU/KVM学习资源
    ubuntu 中创建和删除用户
    git 重命名本地和远程分支
    Ubuntu 上搭建 FTP 服务器
    gdb 常见用法
    git log 显示与特定文件相关的 commit 信息
    基于 qemu system mode 运行 arm 程序
    基于 qemu user mode 运行 aarch64 程序
    checking in(airport)
  • 原文地址:https://www.cnblogs.com/huojiaoqingchun0123/p/7742345.html
Copyright © 2011-2022 走看看