我在虚幻中建立了一个名为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。
该 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.comwcpplanguagenew。 https:/en.cppreference.comwcppmemorynewoperator_new。