编程问题杂烩
为什么构造函数中要传入引用?
ResourceAttribute(const FText& En, const FText& Zh, const EResourceType::Type ResourceType, const int HP,const TArray<TArray<int>>& FlobObjectInfo)
对不容易确定大小但又不想传入之后被修改的对象,比如:vector、string等数据,一般加上const引用,
用引用传参的方式避免不必要的拷贝构造导致的内存和cpu支出,cosnt的限定也保证了传入的参数不会被修改。
对于int、double等简单类型,则一般使用传形参的方式,因为其大小较小而且确定,所以为了方便和保护传入的参数不被修改,一般都直接采用传形参
建议搜索Effective C++ 第20条 或者参考 http://blog.csdn.net/cqk0100/article/details/72897504
在虚幻构造函数中的加载资源
static ConstructorHelpers::FObjectFinder<UStaticMesh>
这里平时都是加上static静态变量修饰符,是为了很早就初始化,如果你是需要这个类随机生成很多物品,就不能用static修饰了,要让它成为对象的变量而不是类的变量;
奔溃问题(Unhandled Exception: EXCEPTION_ACCESS_VIOLATION )
Error LogWindows === Critical error: ===
Error LogWindows Fatal error!
Error LogWindows Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0x0000000000000000
Error LogWindows [Callstack] 0x00007ffb4b0f9b15 UE4Editor-SlAiCourse.dll!ASlAiResourceObject::BeginPlay() [E:\UE4\HopeGame\SlAiCourse\Source\SlAiCourse\Private\Resource\SlAiResourceObject.cpp:29]
Error LogWindows [Callstack] 0x00007ffb68260c1f UE4Editor-Engine.dll!UnknownFunction []
Error LogWindows [Callstack] 0x00007ffb6966ba95 UE4Editor-Engine.dll!UnknownFunction []
Error LogWindows [Callstack] 0x00007ffb689aca31 UE4Editor-Engine.dll!UnknownFunction []
我去到Begin函数看代码,这里我调用的单例类的函数,我猜引擎奔溃的原因是Begin函数比单例类先调用,单例类还没实现
void ASlAiResourceObject::BeginPlay()
{
Super::BeginPlay();
TSharedPtr<ResourceAttribute> ResourceAttr = *SlAiDataHandle::Get()->ResourceAttrMap.Find(ResourceIndex);
if(!ResourceAttr) SlAiHelper::Debug(FString("ResourceAttr Nullptr"), 10.f);
else HP = BaseHP = ResourceAttr->HP;
}
经过调试代码,发现是里面的Map容器还没初始化,类似于空指针异常;
解决办法:不要同步调用,要有一个先后时间。

浙公网安备 33010602011771号