构造函数的巨型开关语句
Giant switch statement for constructors
我有一个容器,其中包含一堆指向基类的指针,以及一个函数,该函数接受一些输入并返回一个类,该类是基类的子类。返回哪个子类取决于输入。
现在,我有一个像这样的大开关语句:
class Base { ... }
class A : public Base { ... }
class B : public Base { ... }
...
class Z : public Base { ... }
Base* depends(int input) {
switch (input) {
case 1:
return new A(...);
case 2:
return new B(...);
...
case 26:
return new Z(...);
default:
...
}
}
我想知道是否有更好的方法来设计这个。我不知道很多"设计模式"(我想它们就是这么叫的),所以我不知道是否有(明显的)更好的方法来设计这个
您正在寻找的是工厂方法模式。
这里重要的是消除了基类对派生类实现的任何知识的需要。基类拥有关于派生类的知识是一种糟糕的设计。
工厂方法模式解决了上述问题,因为创建发生在基类之外。
要弄清楚你的意图是什么有点困难,但是如果你想根据一些输入参数创建一堆不同的子类,你可能想考虑一个抽象工厂模式
另一种方法是创建一个数组,在其中放置指向将调用相应构造函数的函数的指针。在depends()中,您只会调用给定输入所需的函数。但无论如何,这种方法需要26个函数
整型参数"input"来自某个地方。你也许可以让创建int的代码来创建实际的对象。如果你从磁盘或类似的地方读取int值,这将不起作用。
您可以考虑设置这样一种情况,即不同的子类将自己注册到创建它们的对象中。在这种情况下,工厂对象在编译时不需要知道子类。您可以在启动时使用全局变量完成此操作,其构造函数为每个子类进行注册。您的switch语句更简单、更快,但这确实意味着您必须在更改子类时保持switch是最新的。这是一种权衡,我不认为你的解决方案就一定不如一个更详细的方案。
相关文章:
- C 和 C++ 中开关语句的案例标签的常量值,但显示不同的行为
- 为什么布尔开关语句有编译器警告?
- 如何使用"equal to"以外的评估编写开关语句
- 有没有办法在C++将字符串与开关语句一起使用?
- 带有开关语句的 do-while 循环 -- 无穷循环错误
- 如何在不同的开关大小写语句上使用对象的类成员函数?
- C++实用程序,用于将长开关语句转换为封装开关案例阶梯的简洁函数调用
- 如何循环开关语句直到找到所需的数字?
- 使用开关大小写语句抽取随机扑克牌等级和花色以显示用户
- 带有关闭/打开布尔值的开关语句
- 清理开关语句
- 我的开关语句在C++中不起作用
- 枚举和开关语句C++
- 如何在开关语句中使用 cin "as a parameter"
- 重构开关或 if/else 语句?
- "constexpr if"比开关语句好吗?
- C++ 默认值在开关语句中不起作用
- 初学者C :为什么此开关语句给我一个错误
- C 开关语句无法正常工作
- 为什么允许在开关语句中声明变量?但不是声明 初始化