【发布时间】:2016-04-22 17:42:55
【问题描述】:
在我的模拟中,我可以通过三种方式感知不同的对象:可以看到和/或听到和/或闻到对象。例如,可以看到、听到和闻到动物。地上的一块肉看得见摸得着,听不见,只能看到墙。然后我有不同的传感器来收集这些信息 - EyeSensor、EarSensor、NoseSensor。
前状态:简版gist.github.com link
在我开始实现 NoseSensor 之前,我在一个类中拥有所有三个功能,每个对象都继承了 - CanBeSensed,因为尽管类不同,但它们都需要相同的 getDistanceMethod(),如果对象实现了任何 CanBeSensed 功能,它需要一个 senseMask - 标记是否可以听到/看到/闻到对象并且我不想使用虚拟继承。我牺牲了在这个类中为气味、声音、EyeInfo 设置数据成员,因为只能看到的对象不需要气味/声音信息。
然后将对象注册到相应的传感器中。
现在我注意到气味传感器和声音传感器是相同的,并且仅在循环内的一行中有所不同 - 一个调用 float getSound(),另一个调用 float getSmell() 上的 CanBeSensed* 对象。当我创建这两个传感器之一时,我知道它需要调用什么,但我不知道如何在没有条件的情况下选择那条线,它位于一个紧密循环和一个虚函数内。
所以我决定使用getDistanceMethod() 的基类的虚拟继承为这三个功能创建一个基类。
但是现在因为这个方法我不得不把我的 SensorBase 类变成一个模板类
virtual void sense(std::unordered_map<IdInt, CanBeSensed*>& objectsToSense) = 0;
,这意味着我还需要将SensorySubSystem 类(管理范围内的传感器和对象)作为模板。这意味着我的所有子系统(如 VisionSubSystem、HearingSubSystem 和 SmellSubSystem)都继承自模板类,它破坏了我的 SensorySystem 类,该类通过指向SensorySubSystem 类std::vector<SensorySubSystem*> subSystems; 的指针向量管理所有 SensorySubSystems
请您提出一些解决方案,以解决如何重组这个问题或如何让编译器在编译时决定(或至少每次调用决定一次//每次创建对象一次)在 Hearing/Smell 中调用什么方法Sensor秒。
【问题讨论】:
-
未来您是否可能在系统中添加更多类型的传感器?
-
@MartinBroadhurst 好吧,也许吧。您是否建议将我所有的子系统都变成成员变量而不是将它们保存在一个数组中?
-
我在想,如果只有 3 种感官,并且您不太可能再添加,那么在您的基础
CanBeSensed类中拥有 3 个虚函数并拥有不能添加的对象就没有错被一种特定的感觉感知到通过什么都不返回来实现它。 -
是的,您的
SensorySubsystem也可以将传感器作为成员变量。 -
您是否担心不能拥有指向模板类对象的指针向量?如果您从非模板类派生模板类,然后使向量成为指向该非模板基类的对象的指针,则可以。
标签: c++ c++11 inheritance multiple-inheritance