gpt4 book ai didi

c++ - 扩展枚举

转载 作者:太空狗 更新时间:2023-10-29 23:07:53 25 4
gpt4 key购买 nike

我有一个设计问题。

我有一个带有接口(interface) A(抽象接口(interface))的多态结构和一个在类 W 中实现的工作流,它在不知道派生类的情况下使用接口(interface) A。这是在 DLL1 中实现的,我有一个能够返回 A* 的工厂接口(interface) F。在 DLL2 中,我有 A 的具体实现,可以是 A1、A2 等,还有一个能够创建 A1 和 A2 实例的工厂实现 F1。

我的工厂接口(interface)是这样的。

enum ObjectType{typeA1, typeA2};

class F
{
public:
A* create(enum ObjectType) = 0;
}

一些知道 DLL1 和 DLL2 的客户端类会给我具体的对象类型。

但这很丑陋,因为在编写 DLL1 时我必须预先知 Prop 体类的可能类型。这几乎违背了我多态设计的目的。我不想这样做。

我能想到的替代选项是使用字符串,而不是枚举。但是,我喜欢避免使用字符串,因为它们不是类型安全的并且容易出错。我希望我有机会通过继承来扩展枚举,就像类一样。

我的问题:

有更好的出路吗?在 C++11 中可以扩展枚举吗? (虽然我现在没有)

最佳答案

您可以修改您的抽象以允许界面用户 A还提供创建它的特定工厂。 (而不是提供 enum )。

// In DLL1
class AbstractF {
public:
virtual A * create () = 0;
};

template <typename ConcreteA>
class ConcreteF : public AbstractF {
public:
A * create () { return new ConcreteA; }
};

现在,每个 ConcreteF<>对于需要创建 A 的正确具体实例的框架部分,需要将其传递到 DLL1 的代码中.因此,框架用户必须通知框架 A1 中的哪一个 |或 A2不通过传入 ObjectType 来创建, 但通过传递正确的 ConcreteF (即 ConcreteF<A1>ConcreteF<A2> )。

关于c++ - 扩展枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11348413/

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