我有类似于下面的代码,其中一组具有相似共享行为的类(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++ 支持协变返回类型,以便
Owner1
可以返回 Owned1*
。检查返回的指针是否为空几乎是标准做法。另一种方法是返回 optional<IOwned*>
(因为协方差在这里不起作用),但我不知道除了额外的复杂性之外,这会给你带来什么。