Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 更好的课堂设计_C++_Oop_Inheritance_Unreal Engine4 - Fatal编程技术网

C++ 更好的课堂设计

C++ 更好的课堂设计,c++,oop,inheritance,unreal-engine4,C++,Oop,Inheritance,Unreal Engine4,我正在用虚幻引擎4编写一个游戏。该引擎为您提供了几种不同级别的服务。在这个问题中,我将更多地关注这些类之间的联系,而不是它们的目的 引擎的类是这样的(“->”表示继承。例如A->B表示A从B继承): ACharacter->Apown->AActor->…->UObject “…”只是不可删除的类。 UObject类是引擎的主要类,引擎和游戏中的几乎每个类最终都继承了UObject的形式,此外,它还提供了许多我需要的功能。 继承是而不是虚拟继承。这对未来很重要。我无法编辑引擎的任何类 在我的游戏

我正在用虚幻引擎4编写一个游戏。该引擎为您提供了几种不同级别的服务。在这个问题中,我将更多地关注这些类之间的联系,而不是它们的目的

引擎的类是这样的(“->”表示继承。例如A->B表示A从B继承):
ACharacter->Apown->AActor->…->UObject
“…”只是不可删除的类。
UObject类是引擎的主要类,引擎和游戏中的几乎每个类最终都继承了UObject的形式,此外,它还提供了许多我需要的功能。
继承是而不是虚拟继承。这对未来很重要。我无法编辑引擎的任何类

在我的游戏中,有3个主要类: 建筑、生活和实体。
建筑继承自部门和实体
生活继承自人格和实体

我已经创建了实体类来关联建筑或生活,而没有复制我的代码。例如,Living类需要提供攻击另一个Living或Building的功能。所以我可以创建两个函数“AttackLiving”和一个函数“AttackBuilding”,两个函数都有一个活目标参数,两个函数的功能完全相同。相反,我创建了实体类,所以我只有一个函数——“AttackEntity”。当然,这只是一个例子,我在整个代码中都使用了实体类,所以我可以一次引用生活和建筑

问题从实体类开始。我在一年前犯了一个错误,当我真的创造它的时候,我还没有想清楚这一点。问题在于实体并没有从UObject继承。同样,UObject类是引擎的主要类,它提供了我需要的许多函数。因为实体不从UObject继承,所以我无法访问我需要的任何函数

我无法从UObject或AActor进行实体继承,因为虚拟继承在这里不起作用。(同样,引擎类继承不是虚拟继承)

我已经考虑了许多可能的解决办法。其中之一是,我可以根据实体的类型将实体向下转换为建筑或生活,然后使用UObject的函数。但这是一个非常丑陋的解决方案,它与实体的目的形成了对比——与个人生活和建筑无关

我还想过在实体中有一个指向UObject类的指针,但这是一个非常丑陋的解决方案,它不能解决所有问题。对于一个实例,实体的另一个问题(它也不是从UObject继承的):有一个名为“TWeakObjectPtr”的模板类,它在模板中获取一个类,为它创建一个指针,并检查引擎是否在其他任何地方释放该指针

TWeakObjectPtr<Entity> entityPointer;
TWeakObjectPtr EntityPointInter;
问题是TWeakObjectPtr检查模板中给定的类是否继承UObject,当然不是这样,所以我不能使用TWeakObjectPtr

总而言之,主要问题是实体不是从UObject继承的。但我确实需要它,这样我才能把生活和建筑联系起来


如果你能提出一个保持实体的解决方案,我会很高兴的。提前谢谢

我从未使用过虚幻引擎,但希望下面的一些想法能对我有所帮助

改善这种情况的一种方法是断开两个对象层次结构(您的和引擎的)之间的继承链接:

UOjbect <-- AActor <-- APawn <-- ACharacter
               |                    |
+------+       *                    |
|      |<-- Building                |
|Entity|                            *
|      |<------------------------ Living
+------+
在这里,您可以在需要engine对象的地方使用
Building
/
Living
,但是当您想要引用自己的逻辑时,您将使用类似
Building->getEntity()
的内容。 您可能有不同的
实体
子类来实现
构建
生活
行为


此外,我还建议您阅读《设计模式:可重用面向对象软件的元素》一书,《结构模式》一章可能会帮助您找到更多想法。

UObject是UE4的基类。一切都必须从UObject继承。我建议修改你的实体类来实现这一点,否则我不相信它会起作用。另外,在游戏开发论坛上,你可能会得到更多的帮助:@ethancodes我知道,但我不能让它从UObject继承,因为虚拟继承在这里不起作用。对于这个问题你有什么实际的解决方案吗?是的,使用接口或Actor组件。我不明白这对我有什么帮助。你说的接口是什么意思?哪一节课?参与者组件在这个问题上必须做什么?嘿,Boris,谢谢你的回答,第一个解决方案并不能解决问题-实体需要从UObject继承。我看不出聚合将如何解决这个问题。对于第二个解决方案——我不认为你已经理解了实体的目的——实体是一个建筑和生活的接口,如果他们将其聚合而不是继承,那么实体的整个概念将毫无意义。我要看这本书。非常感谢。
UOjbect <-- AActor <-- APawn <-- ACharacter
               ^                    ^
+------+       |                    |
|      |--* Building                |
|Entity|                            |
|      |------------------------* Living
+------+