【问题标题】:UE4 creating a new c++ gamemode classUE4 创建一个新的 c++ 游戏模式类
【发布时间】:2020-06-20 20:47:41
【问题描述】:

我正在头文件中定义一个类。它继承自另一个名为 AGameMode 的类。在编辑器中,我正在从 Gamemode 创建新类,它会自动生成 .h 和 .cpp 文件。问题是,我已经包含了必要的头文件,但仍然看不到我想从中继承的类。相反,它会引发我的错误。让我用代码解释一下:

//ACollectorMan_GameMode.h 

#include "CoreMinimal.h"
#include "GameFramework/GameMode.h"
#include "CollectorMan_GameMode.generated.h"

UCLASS()
class MYPROJECT2_API ACollectorMan_GameMode : public AGameMode
{
    GENERATED_BODY()
    ACollectorMan_GameMode();
}

当我声明构造函数并编译时,它会显示错误。但是如果我不声明它,在编辑器第 7 行(class MYPROJECT2_API ACollectorMan_GameMode : public AGameMode)不会抛出错误(仍然是红色的)。

这不仅适用于 Gamemode 父类。 Character 或 Pawn 类有同样的问题。当我构建 VS 时给了我这个错误:

CollectorMan_GameMode.cpp.obj : error LNK2019: unresolved external symbol "private: __cdecl ACollectorMan_GameMode::ACollectorMan_GameMode(void)" (??0ACollectorMan_GameMode@@AEAA@XZ) referenced in function "public: static void __cdecl ACollectorMan_GameMode::__DefaultConstructor(class FObjectInitializer const &)" (?__DefaultConstructor@ACollectorMan_GameMode@@SAXAEBVFObjectInitializer@@@Z)

CollectorMan_GameMode.gen.cpp.obj : error LNK2001: unresolved external symbol "private: __cdecl ACollectorMan_GameMode::ACollectorMan_GameMode(void)" (??0ACollectorMan_GameMode@@AEAA@XZ)

这应该是链接器问题,但是“GameFramework/GameMode.h”中提供了“GameMode.h”文件。我可以给你看一个类似的文件。但它的作品。有一个例子:

#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "MyProject2GameMode.generated.h"

UCLASS()
class AMyProject2GameMode : public AGameModeBase
{
     GENERATED_BODY()
     AMyProject2GameMode(); 
};

我就是这么说的。 提前致谢。

【问题讨论】:

  • 错误是说你必须实现你的构造函数,或者删除声明。如果您保留它们,它们还需要是public

标签: c++ unreal-engine4


【解决方案1】:

有几件事需要解决,首先,您确定您知道 UCLASS() 的作用吗?在我 3 年的 c++ 中,我从未见过这种类型的类声明。另外您的第二个包含语句 GameFrameWork/GameModeBase.h 似乎建议您将头文件和 cpp 文件放在不同的文件夹中,不要这样做,c ++将无法找到您的头文件。所以你的 cpp 不知道你的头文件,因此找不到在你的头文件中声明的函数。

【讨论】:

  • UCLASS() 使用引擎中的所有 c++ 类头文件。头文件和 cpp 文件在同一目录中。当包含一个名为“GameFramework/Header.h”的引擎头时。看看这个:link
  • UCLASS 是虚幻的,关于GameFrameWork/GameModeBase.h 的第二部分对我来说毫无意义。
  • 是的,UCLASS 是问题所在,一般来说,你不依赖 C++ 默认构造函数来初始化你的变量,这是一种不好的做法,如果你想依赖的话,我很少看到它在默认构造函数上请坚持使用 Java,请重载类......
  • 另外,如果您需要提示,请检查第一个错误的这一部分: DefaultConstructor(class FObjectInitializer const &)
  • 哇,这个 Game FrameWork 库也让我想起了 JS……嗯,不知道我们在 C++ 中有这个……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多