构造函数请求错误的参数数

Constructor Asking for Wrong Number of Arguments

本文关键字:参数 数数 错误 请求 构造函数      更新时间:2023-10-16

我在虚幻引擎中构建了一个名为Groundmode的类

接地模式.h: #pragma 一次

#include "CoreMinimal.h"
#include "UObject/NoExportTypes.h"
#include "Components/BoxComponent.h"
#include <NMRGroundDirection.h>
#include "GroundMode.generated.h"
UCLASS()
class NMR_API UGroundMode : public UObject
{
GENERATED_BODY()
public:
UGroundMode();   
};

接地模式.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;
};

玩家物理碰撞信息.cpp: #include "PlayerPhysicsCollisionInfo.h">

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

当我尝试使用 new 关键字创建 UGroundMode 的实例时,出现以下编译错误: D:\文档\虚幻项目\核磁共振\来源\核磁共振\播放器物理碰撞信息.cpp(25(:错误 C2661:"UG圆形模式::运算符新":没有重载函数占用 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.com/w/cpp/language/new https://en.cppreference.com/w/cpp/memory/new/operator_new