正确答案取决于您要为其创建实例的不同类的数量。
如果数量很大(应用程序应该能够在您的应用程序中创建任何类的实例),您应该使用 .Net 的反射功能。但是,老实说,我不太喜欢在业务逻辑中使用反射,所以我建议不要这样做。
我认为实际上您想要为其创建实例的类数量有限。所有其他答案都做出了这个假设。您真正需要的是工厂模式。在接下来的代码中,我还假设您要为其创建实例的类都派生自同一个基类,比如说 Animal,如下所示:
class Animal {...};
class Dog : public Animal {...}
class Cat : public Animal {...}
然后创建一个抽象工厂,它是一个创建动物的接口:
class IFactory
{
public:
Animal *create() = 0;
};
然后为每种不同种类的动物创建子类。例如。对于 Dog 类,这将变为:
class DogFactory : public IFactory
{
public:
Dog *create() {return new Dog();}
};
猫也是如此。
DogFactory::create 方法优先于 IFactory::create 方法,即使它们的返回类型不同。这就是所谓的协变返回类型。只要子类方法的返回类型是基类的返回类型的子类,这是允许的。
您现在可以将所有这些工厂的实例放入地图中,如下所示:
typedef std::map<char *,IFactory *> AnimalFactories
AnimalFactories animalFactories;
animalFactories["Dog"] = new DogFactory();
animalFactories["Cat"] = new CatFactory();
用户输入后,你必须找到正确的工厂,并要求它创建动物的实例:
AnimalFactories::const_iterator it=animalFactories.find(userinput);
if (it!=animalFactories.end())
{
IFactory *factory = *it;
Animal *animal = factory->create();
...
}
这是典型的抽象工厂方法。
还有其他方法。在自学 C++ 时,我写了一篇关于它的 CodeProject 小文章。你可以在这里找到它:http://www.codeproject.com/KB/architecture/all_kinds_of_factories.aspx。
祝你好运。