我在虚幻引擎中构建了一个名为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
表达式,就像你在这里所做的那样,做了两件事。
- 它通过为对象调用适当的分配函数来为对象分配内存。
- 它在分配的内存中构造对象。
当它调用类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