C++ 指针相关的UE4崩溃。我的指针哪里错了?

C++ 指针相关的UE4崩溃。我的指针哪里错了?,c++,unreal-engine4,C++,Unreal Engine4,我正在创建一个第三人称激光标签射击游戏,我很难创建我的武器等级。我的主要问题是,我的编辑器由于代码中指针的一些错误导致访问错误而崩溃,而我对指针的理解还不足以让我自己解决这个问题 我想给我的默认棋手添加一件武器。我使用TSubclassOf来确保我只能将Alt武器的子元素附加到我的角色上 如果这有助于我的解释,那么当前的层次结构是: APawn->ALTENARM->ALaserGun 。。。我正计划添加更多的类,以AltBlarm作为它们的父类。我希望这将使我的代码更有条理,更容易为每种武器编

我正在创建一个第三人称激光标签射击游戏,我很难创建我的武器等级。我的主要问题是,我的编辑器由于代码中指针的一些错误导致访问错误而崩溃,而我对指针的理解还不足以让我自己解决这个问题

我想给我的默认棋手添加一件武器。我使用TSubclassOf来确保我只能将Alt武器的子元素附加到我的角色上

如果这有助于我的解释,那么当前的层次结构是:

APawn->ALTENARM->ALaserGun

。。。我正计划添加更多的类,以AltBlarm作为它们的父类。我希望这将使我的代码更有条理,更容易为每种武器编写不同的功能

考虑到这一点,我将从ALTPlayer.h文件开始。这里我声明WeaponClass作为我的子类变量

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "LTPlayer.generated.h"

class ALTWeapon;

UCLASS()
class LASERTAG_API ALTPlayer : public ACharacter
{
    GENERATED_BODY()

public:
    // Sets default values
    ALTPlayer();

    // Player weapon
    UPROPERTY(EditAnywhere)
    TSubclassOf<ALTWeapon> WeaponClass;
};

#pragma一次
#包括“coremilimal.h”
#包括“GameFramework/Character.h”
#包括“LTPlayer.generated.h”
类武器;
UCLASS()
LASERTAG_API ALTPlayer类:公共字符
{
生成的_BODY()
公众:
//设置默认值
ALTPlayer();
//玩家武器
乌洛佩蒂(EditAnywhere)
TSUBC武器类;
};
现在我将进入ALTPlayer.cpp文件。这里我试图创建一个ALaserGun对象,它存储在WeaponClass中。(我也不确定我是否应该这样做)

#包括“LTPlayer.h”
#包括“LaserGun.h”
//设置默认值
ALTPlayer::ALTPlayer()
{
//制造武器
此->武器类->获取默认对象();
}
在这一点上,我希望在我的ALTPlayer的子蓝图中看到一个ALaserGun组件。尽管如此,由于指针问题使我的编辑器崩溃,我不知道这段代码是否会产生这样的结果


如果有人对如何修复我的指针有任何见解,这样我就不会受到访问冲突,那太棒了

当您尝试访问武器类的默认对象时,您正在尝试取消对武器类的引用,但该对象尚未分配给任何对象

您可以在构造函数初始值设定项列表中对其进行初始化,如下所示:

ALTPlayer::ALTPlayer()
    : WeaponClass(ALTWeapon::StaticClass())
{
}
如果这是一个可以在Blueprint默认值中设置的类,您还可以通过在PreInitializeComponents中设置它来确保它有一个值:

声明:

//~ Begin AActor Interface
virtual void PreInitializeComponents() override;
//~ End AActor Interface
定义:

void ALTPlayer::PreInitializeComponents()
{
    Super::PreInitializeComponents();

    // Fallback to default Weapon class if none was specified.
    if (WeaponClass == nullptr)
    {
        UE_LOG(LogGameMode, Warning, TEXT("No WeaponClass was specified in %s (%s)"), *GetName(), *GetClass()->GetName());
        WeaponClass = ALTWeapon::StaticClass();
    }
}

在不太了解UE4的情况下,
WeaponClass
似乎将成为一种指针。在你引用它之前,你不能在你的代码> AltPooth[/Cudio]构造函数中任何地方指出它。这根本不是一个什么方法,我建议你做一些基本的UE4C++教程。自从我做了UE4以来有一点点,但是你应该检查<代码> WeaponClass <代码>不是<代码> null ptr>代码>(也就是说它已经在检查器中被分配). 另外,我认为您可能更倾向于使用
if(WeaponClass!=nullptr)World->SpawnActor(WeaponClass)您可能想看看spawn actor函数,并可能将枪连接到ltplayer上的场景组件。导致崩溃的原因是序列化发生在构造之后,因此不会设置任何属性,因此WeaponClass可能还不能指向任何东西。@George我正在尝试您的建议,我正在使用spawn actor。但我仍然受到访问权限的侵犯。我像往常一样在我的LTPlayer.h文件中声明武器类:
tsubclasssof WeaponClass在我的LTPlayer.cpp文件中,对WeaponClass的唯一引用是:
GetWorld()->SpawnActor(WeaponClass,GetActorLocation(),GetActorRotation(),weaponspawnawParameters)
void ALTPlayer::PreInitializeComponents()
{
    Super::PreInitializeComponents();

    // Fallback to default Weapon class if none was specified.
    if (WeaponClass == nullptr)
    {
        UE_LOG(LogGameMode, Warning, TEXT("No WeaponClass was specified in %s (%s)"), *GetName(), *GetClass()->GetName());
        WeaponClass = ALTWeapon::StaticClass();
    }
}