gpt4 book ai didi

c++ - 根据用户输入创建相应派生类的最佳做法是什么?

转载 作者:搜寻专家 更新时间:2023-10-31 01:36:34 27 4
gpt4 key购买 nike

目前,我有一个接口(interface)和几个具体的实现类,我得到了string类型的用户输入。我想根据用户输入新建相应的类。执行这些操作的最佳做​​法是什么?

似乎“工厂模式”可以用于此。现在,我使用一个enum,一个unordered_function和一个特定的函数来处理它,代码如下:

class IStrategy{};
class A : public IStrategy{};
class B : public IStrategy{};
class C : public IStrategy{};
class D : public IStrategy{};

enum StrategyEnum
{
A = 0,
B,
C,
D,
};

const std::unordered_map<std::string, StrategyEnum> ms_lut{
{"A", A},
{"B", B},
{"C", C},
{"D", D}};

Strategy* get_strategy(StrategyEnum s)
{
Strategy* s;
switch(s)
{
case A:
s = new A;
break;
case B:
s = new B;
break;
case C:
s = new C;
break;
case D:
s = new C;
break;
default:
cerr << "Unsupported strategy!" << endl;
}
return s;
}

而且,在我目前的情况下,所有派生类都有相同的构造函数参数,如果不同的类有不同的构造函数参数怎么办?

最佳答案

尚不清楚enum 在这里如何帮助您:

  1. 这似乎是重复,因为它基本上是在进行工厂可以进行的翻译(因此您有一个将用户输入翻译成枚举,另一个将枚举翻译成类)

  2. 它限制您只使用可以枚举的东西(例如,您现在不能将“除了用户输入的最后 3 位数字之外的所有内容”传递给 ctor,因为那不是可枚举的东西) .


相反,让工厂依赖于用户输入怎么样?你可以做非常多才多艺的事情:

Strategy* get_strategy(const string &s)
{
// If the input is "foo", return A{}
if(s == "foo")
return new A{};

// If the input starts with "bar", return B{s}
if(s.substr(0, 3) == "bar")
return new B{s}

// etc.

关于c++ - 根据用户输入创建相应派生类的最佳做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35435112/

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