C++ 构造函数的巨型开关语句

C++ 构造函数的巨型开关语句,c++,inheritance,switch-statement,class-hierarchy,construction,C++,Inheritance,Switch Statement,Class Hierarchy,Construction,我有一个容器,其中包含一组指向基类的指针,还有一个函数,它接受一些输入并返回一个基类的子类。它返回哪个子类取决于输入 现在,我有一个巨大的开关声明如下: class Base { ... } class A : public Base { ... } class B : public Base { ... } ... class Z : public Base { ... } Base* depends(int input) { switch (input) { case 1

我有一个容器,其中包含一组指向基类的指针,还有一个函数,它接受一些输入并返回一个基类的子类。它返回哪个子类取决于输入

现在,我有一个巨大的开关声明如下:

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:
        ...
    }
}

我想知道是否有更好的设计方法。我不知道有多少“设计模式”(我想这就是他们所说的),所以我不知道是否有(明显的)更好的方法来设计它。

很难弄清楚你打算用它做什么,但是,如果你想根据一些输入参数创建一组不同的子类,你可能需要考虑一个抽象的工厂模式。

< P>另一种方法是创建一个数组,在那里你可以把指针放置到调用相应构造函数的函数中。在depends()中,您只需通过给定的输入调用所需的函数。但是在这种方法中,您需要26个函数,您需要的是一个

这里重要的一点是不需要基类了解派生类实现。对于基类来说,了解派生类是一种糟糕的设计

工厂方法模式解决了上述问题,因为创建发生在基类之外

整数参数“input”来自某个地方。您可以让创建该int的代码创建实际对象。如果您正在从磁盘或类似的地方读取int,那么这将不起作用


你可以考虑设置一个不同的子类用创建它们的对象来登记自己的情况。在这种情况下,工厂对象不需要在编译时了解子类。您可以在启动时使用全局变量完成此操作,全局变量的构造函数为每个子类进行注册。switch语句更简单、更快,但它确实意味着您必须在更改子类时使开关保持最新。这是一个折衷方案,我不认为您的解决方案一定不如更复杂的解决方案。

最好有一个字典将您的键映射到类或类名(如果您的键是int,则只需一个数组)。但这可能吗?请看类似的问题:@Ray谢谢你的链接,这个问题与我的问题非常相似,并且几乎回答了这个问题。不幸的是,这正是这个程序所做的——从文件中读取数据。这个程序需要它所能获得的每一点效率,所以我认为坚持使用
开关将是一个好办法。谢谢。@Seth Carnegie您可能想做的一件事是让子类定义一个静态常量字段,比如classId。然后,创建对象的代码和将id写入磁盘的代码都可以引用同一个字段。是的,它就是这样做的。我宁愿那样做。