如何动态创建类对象?

Neb*_*ort 15 c++ oop dynamic

假设我有一个类框,用户可以创建框.怎么做?我理解我是className objectName(args);根据用户输入创建对象但是如何动态创建对象?

Pat*_*ick 21

正确答案取决于您要创建实例的不同类的数量.

如果数量巨大(应用程序应该能够在应用程序中创建的任何类的一个实例),你应该使用的.Net的反射功能.但是,说实话,我不是用商业逻辑思考的大风扇,所以我会建议不要这样做.

我认为实际上你想要创建实例的类数量有限.所有其他答案都做出了这个假设.你真正需要的是工厂模式.在接下来的代码中,我还以为它的要创建实例类,都来自同一个基类派生,让我们说动物,就像这样:

class Animal {...};
class Dog : public Animal {...}
class Cat : public Animal {...}
Run Code Online (Sandbox Code Playgroud)

然后创建一个抽象工厂,它是一个创建动物的接口:

class IFactory
   {
   public:
      Animal *create() = 0;
   };
Run Code Online (Sandbox Code Playgroud)

然后为每种不同种类的动物创建子类.例如对于Dog类,这将成为:

class DogFactory : public IFactory
   {
   public:
      Dog *create() {return new Dog();}
   };
Run Code Online (Sandbox Code Playgroud)

和猫一样.

DogFactory :: create方法否决了IFactory :: create方法,即使它们的返回类型不同.这就是所谓的共变量返回类型.只要子类的方法的返回类型是基类的返回类型的子类,就允许这样做.

你现在可以做的是将所有这些工厂的实例放在一个地图中,如下所示:

typedef std::map<char *,IFactory *> AnimalFactories
AnimalFactories animalFactories;
animalFactories["Dog"] = new DogFactory();
animalFactories["Cat"] = new CatFactory();
Run Code Online (Sandbox Code Playgroud)

用户输入后,您必须找到正确的工厂,并要求它创建动物的实例:

AnimalFactories::const_iterator it=animalFactories.find(userinput);
if (it!=animalFactories.end())
   {
   IFactory *factory = *it;
   Animal *animal = factory->create();
   ...
   }
Run Code Online (Sandbox Code Playgroud)

这是典型的抽象工厂方法.还有其他方法.在自学C++时,我写了一篇关于它的小型CodeProject文章.您可以在此处找到它:http://www.codeproject.com/KB/architecture/all_kinds_of_factories.aspx.

祝好运.


Ton*_*vel 5

以下工厂方法Box根据用户输入动态创建实例:

class BoxFactory
{
  public:
    static Box *newBox(const std::string &description)
    {
      if (description == "pretty big box")
        return new PrettyBigBox;
      if (description == "small box")
        return new SmallBox;
      return 0;
    }
};
Run Code Online (Sandbox Code Playgroud)

当然,PrettyBigBox和SmallBox无论从派生Box.看一下C++设计模式wikibook中的创建模式,因为其中一个可能适用于您的问题.