Правильный ответ зависит от количества различных классов, для которых вы хотите создать экземпляры.
Если число велико (приложение должно иметь возможность создавать экземпляр любого класса в вашем приложении), вы должны использовать функциональность отражения .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 ++, я написал небольшую статью об этом.Вы можете найти его здесь: http://www.codeproject.com/KB/architecture/all_kinds_of_factories.aspx.
Удачи.