从抽象类派生的类中获取派生自抽象类的类的可选值

问题描述 投票:0回答:1

我有类似于下面的代码,其中一组具有相似共享行为的类(Tool1,Tool2),全部继承自抽象类(ITool)。所有这些类都拥有自己的相应类(Tool1Attachment、Tool2Attachment)的可选选项,这些类也继承自抽象类(IAttachment)。

class ITool {
 private:
  virtual ? DoGetAttachment() = 0;
  // Other shared behaviours...

 public:
  ? GetAttachment() {return DoGetAttachment();}
  // Other shared behaviours...
};

class Tool1: public ITool {
  std::optional<Tool1Attachment> opt_attachment;

  ? DoGetAttachment() override;
  
 public:
  [...]
};

class Tool2: public ITool {
  std::optional<Tool2Attachment> opt_attachment;
  
  ? DoGetAttachment() override;
  
 public:
  [...]
};

// --------------------------------

class IAttachment {
  [...]
};

class Tool1Attachment : public IAttachment {
  [...]
};

class Tool2Attachment : public IAttachment {
  [...]
};

工具类有一个可选的是有意义的 - 在上下文中,它在任何给定时间可能有也可能没有实际实例。

如果我有 IAttachment,并且想要获取 IAttachment,则会出现问题。

我最初为此使用指针,即

IAttachment* GetAttachment();
,效果“很好”。然而,它似乎失去了一些对可选提供的缺失值的更明确的检查,使得将来更容易遇到 nullptr 问题。

我还尝试了带有选项的不同构造(std::reference_wrapper),但一直遇到无效的协变错误。

有没有一种方法可以允许返回可选(或类似的构造)?返回类型应该是什么样的?或者带有 nullptr 检查的指针在这里最合适吗?

? GetAttachment() {return DoGetAttachment();}
c++ inheritance polymorphism stdoptional
1个回答
1
投票

指针是显而易见的解决方案(如果可选项为空,则使用空指针)。如果您使用继承,无论如何您都需要一个指针(或引用),以便多态性发挥作用,并且 C++ 支持协变返回类型,以便

Owner1
可以返回
Owned1*
。检查返回的指针是否为空几乎是标准做法。另一种方法是返回
optional<IOwned*>
(因为协方差在这里不起作用),但我不知道除了额外的复杂性之外,这会给你带来什么。

© www.soinside.com 2019 - 2024. All rights reserved.