构造函数询问错误的参数数。

问题描述 投票:0回答:1

我在虚幻中建立了一个名为Groundmode的类。

GroundMode.h: #pragma一次

#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "Components/BoxComponent.h"
#include <NMR\GroundDirection.h>
#include "GroundMode.generated.h"

UCLASS()
class NMR_API UGroundMode : public UObject
{
    GENERATED_BODY()

    public:
        UGroundMode();   
};

GroundMode.cpp。

#include "GroundMode.h"

UGroundMode::UGroundMode() {}

我希望能够在另一个类中实例化这个类,PlayerPhysicsCollisionInfo.h。

#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "GroundMode.h"
#include "PlayerPhysicsCollisionInfo.generated.h"


UCLASS( ClassGroup=(Custom), meta=(BlueprintSpawnableComponent) )
class NMR_API UPlayerPhysicsCollisionInfo : public UActorComponent
{
    GENERATED_BODY()

public: 
    UPlayerPhysicsCollisionInfo();

    UGroundMode downMode;
    UGroundMode upMode;
    UGroundMode leftMode;
    UGroundMode rightMode;
};

BS.PlayerPhysicsCollisionInfo.cpp: #include "PlayerPhysicsCollisionInfo.h"

    void UPlayerPhysicsCollisionInfo::BeginPlay()
    {
        Super::BeginPlay();
        downMode = new UGroundMode();
        upMode = new UGroundMode();
        leftMode = new UGroundMode();
        rightMode = new UGroundMode();
    }

当我试图用新关键字创建UGroundMode实例时,我得到以下编译错误。 D:Documents/Documents/Unreal Projects/NMR/Source/NMR/PlayerPhysicsCollisionInfo.cpp(25) : 错误 C2661: 'UGroundMode::operator new': 没有重载函数接受1个参数。

我做错了什么?构造函数不接受任何参数,不是1。

c++ unreal-engine4 unreal-development-kit
1个回答
1
投票

new 表达式,就像你在这里做的那样,做两件事。

  1. 它通过调用对象的适当分配函数为该对象分配内存。
  2. 它在该分配的内存中构造对象。

当它调用一个类的分配函数时 T,它首先确定该类的大小。std::size_t size并将其作为第一个参数传递给分配函数。一个类的分配函数是第一个解析的 operator new() 类在其作用域内可使用的函数。任何可选的 安置参数 然后作为下一个参数发送到分配函数。放置参数是紧跟在 new 关键字。

T* foo = new T(); // good old fashioned uncomplicated new
          ^
          |
          +---- wants to call a `operator new(std::size_t)` function

T* bar = new(1, 2) T(); // a little more complicated
          ^    ^
          |    |
          |    +----- these are placement params
          +---------- wants to call `operator new(std::size_t, int, int)`

你的问题是,当 new 表达式尝试进行分配,并找到其合适的 operator new(). 类可以覆盖 operator new()你的班级就是这样的。的 new 关键词将采取 sizeof(T)并试图将其作为第一个参数发送到类定义的 operator new 函数。

那个类定义的重载的 operator new() 功能,你问?

就在这里

UObject你的类所继承的,有一个 void* UObject::operator new() 宣布了一个函数,需要五个,算上'em FIVE,参数。

new 关键字标识了这个 operator new() 作为你的班级 operator new(),但看到你只传递了一个参数(sizeof(T)),而失败。


解决办法

如同链接的虚幻页面上所描述的那样。new 表达式不能与 UObject 对象。使用 StaticConstructObject() 来代替。


如果你想调用全局的 operator new 反正

如果你想让虚幻引擎甚至 虚幻您可以指定一个合适的 operator new 函数的显式范围。你可以 尝试 访问全球 operator new() 函数,把全局范围指示器放在你的前面。new 声明。

downMode = ::new UGroundMode();

当然,你会遇到一个问题,那就是... ::new UGroundMode()芸芸众生 new 操作,返回一个 UGroundMode* 您试图将其存储在 UGroundMode 对象。这将失败。我不知道它会对虚幻引擎造成什么影响。可能是坏事。


进一步阅读

https:/en.cppreference.comwcpplanguagenew。 https:/en.cppreference.comwcppmemorynewoperator_new。

© www.soinside.com 2019 - 2024. All rights reserved.