gpt4 book ai didi

C++ 类层次结构设计选择

转载 作者:行者123 更新时间:2023-11-30 05:33:15 26 4
gpt4 key购买 nike

在我的模拟中,我有可以通过三种方式感知的不同对象:可以看到和/或听到和/或闻到对象。例如,可以看到、听到和闻到动物。地上的一 block 肉可以看到和闻到但听不到,只能看到墙。然后我有不同的传感器收集这些信息 - EyeSensor , EarSensor , NoseSensor .

前状态:简要版本gist.github.com link

在我开始实现 NoseSensor 之前,我在一个类中拥有所有三个功能,每个对象都继承了它 - CanBeSensed因为虽然类(class)不同,但他们都需要相同的getDistanceMethod()如果对象实现了任何CanBeSensed它需要一个 senseMask 功能 - 如果可以听到/看到/闻到对象,我不想使用虚拟继承。我牺牲了这个类中的数据成员来换取气味、声音、EyeInfo因为只能看到的物体不需要气味/声音信息。

然后对象被注册到相应的传感器中。

现在我注意到气味和声音传感器是相同的,只是在循环内的一行中有所不同 - 一个调用 float getSound()和另一个 float getSmell()CanBeSensed* 上目的。当我创建这两个传感器之一时,我知道它需要调用什么,但我不知道如何在没有条件的情况下选择那条线,而且它在一个紧密的循环和一个虚函数中。

所以我决定为这 3 个功能创建一个基类,使用基类的虚拟继承 getDistanceMethod() .

但现在由于这个方法,我不得不让我的 SensorBase 类成为模板类

virtual void sense(std::unordered_map<IdInt, CanBeSensed*>& objectsToSense) = 0;

,这意味着我需要制作 SensorySubSystem类(管理范围内的传感器和对象)也是一个模板。这意味着我所有的子系统,如 VisionSubSystem、HearingSubSystem 和 SmellSubSystem 都继承自模板类,它破坏了我的 SensorySystem 类,该类通过指向 SensorySubSystem 的指针 vector 管理所有 SensorySubSystems。类 std::vector<SensorySubSystem*> subSystems;

请问,您能否建议一些解决方案,以解决如何重组这个问题或如何让编译器在编译时决定(或至少每次调用一次//每次对象创建一次)在 Hearing/Smell 中调用什么方法 Sensor

最佳答案

看着您的原始设计,我有几点意见:

  • hierarchy.cpp 中的类设计在我看来还不错。
  • 除非距离是特定于感官信息的东西,否则 getDistance() 看起来不像属于此类的方法。它可以移动到 Vec2d 类或辅助函数 (calculatePositon(vec2d, vec2d))。我不明白,为什么 getDistance() 是虚拟的,如果它做的事情不同于计算给定位置和对象位置之间的距离,那么它应该重命名。
  • CanBeSensed 类听起来更像是一个属性,应该重命名为例如SensableObject。

关于您的新方法:
继承应该主要用于表达概念(is-a-relations),而不是共享代码。如果您想重用算法,请考虑编写一个算法类或函数(有利于组合而不是继承)。

总而言之,我建议让您的原始类设计如上所述进行一些清理。您可以将虚函数 canBeSmelled/canBeHeard/canBeSeen 添加到 CanBeSensed。
或者你可以创建一个类层次结构:

  • 类对象{ getPosition();
  • ObjectWithSmell 类:虚拟对象
  • ObjectWithSound 类:虚拟对象
  • ...

但是你必须处理虚拟继承而没有任何明显的好处。
共享计算代码可以进入算法类或函数。

关于C++ 类层次结构设计选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34839719/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com